Tafsirkan Volatile

11

Tafsirkan Volatile

Volatile adalah esolang berbasis stack yang dibuat oleh A_ / a '_' / A yang hanya memiliki 8 instruksi dan sedang menyelesaikan. Namun, ini juga non-deterministik ... artinya program tidak selalu memberikan hasil yang sama. Tugas Anda adalah menafsirkan bahasa ini.

Spesifikasi bahasa

Diambil dari halaman esolangs:

~: Push a random integer in any range of integers. Minimum range of 0 through 32768

+: Pop 2 values and push the sum of the 2 values

-: Like +, but subtracts

*: Multiply

/: Divide. 0-division will result in an error.

:: Duplicate the top of the stack

.: Output the top of the stack without popping it


(...): Execute ... inside a while loop when the top of the stack is not 0

Segala sesuatu yang lain diabaikan

Memasukkan

Perhatikan bahwa program ini dapat gagal secara acak

~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.~:/:::::::::::::::::::::::::::::::::+++++++++++++++++++++++++++++++++.~:/::::::::::++++++++++.

~:-.~:/+.(~:/+.)

~:-:/

Keluaran

73 102 109 109 112 45 33 120 112 115 109 101 34 11

0 1 2 3 4 5 6 7 8 9 ...

<Any Error Message>

Lebih banyak contoh, serta implementasi referensi (gunakan yang kedua, ditemukan di bawah (Lain) python 3 interpreter ) dapat ditemukan di https://esolangs.org/wiki/Volatile

Mencetak gol

Ini adalah kode-golf, jadi jawaban tersingkat dalam byte menang

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

# Perl, 43 + 2 (-p flag) = 45 bytes

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

Laksal
sumber
2
Apakah pembagian seharusnya membulatkan ke 0?
Grimmy
Apakah ~mendorong bilangan bulat, atau nomor apa saja?
mbomb007
1
Juga, tergantung pada implementasinya, ini mungkin tidak benar-benar non-deterministik. Tentu, halaman esolang mengklaim itu, tapi itu hanya karena cara terdaftar untuk mendorong 1, yang mungkin dibagi dengan nol. ~harus dapat menekan nol, kalau tidak itu deterministik. Selain itu, RNG harus selalu dapat mengembalikan nol setelah sejumlah nol dalam satu baris.
mbomb007
2
Bukankah seharusnya input kedua ~:-.~:/+.(~:/+.)mulai dari 0 1 2 ...bukan 1 2 3 ...? Itu ~:-.akan menghasilkan 0 yang akan dikeluarkan. Penerjemah-penafsir pada halaman Esolang tampaknya mengkonfirmasi ini (di sini yang kedua ).
Kevin Cruijssen
2
Saran untuk menambahkan test case:~:-.(~:/+.)
Night2

Jawaban:

6

05AB1E , 35 byte

"~:/.()"”žGÝΩ DŠéõq}÷ = [D_# }”#‡.V

Cobalah online!

Transpiles kode Volatile ke 05AB1E, lalu eval. *, +dan -dapat dibiarkan apa adanya. :,, .dan )memiliki setara langsung satu byte. Perintah lain masing-masing mengambil beberapa byte. Sayangnya, 05AB1E tidak mogok di divisi oleh 0, jadi ini malah diterapkan oleh kondisi "berhenti jika bagian atas tumpukan == 0".

Grimmy
sumber
1
Apakah ini berfungsi dengan benar untuk loop. Jika saya memasukkan case uji kedua sepertinya keluar 0dan 1benar sebelum loop, tetapi kemudian mulai mengeluarkan program Volatile (input implisit) itu sendiri. Saya suka D Doingõqstring kamus untuk pernyataan if, btw! :)
Kevin Cruijssen
1
@KevinCruijssen contohnya tampaknya menganggap loop adalah a while peek, tetapi dalam interpreter referensi itu a while pop. Contohnya dapat diperbaiki dengan menambahkan beberapa :( TIO ). Atau, kode saya dapat diubah menjadi while peekdengan menambahkan a D.
Grimmy
1
Kedua penerjemah referensi dari Esolang masih menghasilkan 0 1 2 3 .... Saya belum melihat kode sumber mereka, tetapi hanya mencoba keduanya.
Kevin Cruijssen
1
@KevinCruijssen Oh, fungsinya bernama pop tapi sebenarnya mengintip. Membingungkan secara maksimal. Saya menambahkan Dkode saya.
Grimmy
Lol .. Nama builtin yang membingungkan mengingatkan saya pada Java replacevs replaceAll(yang keduanya menggantikan semua kejadian, tetapi replaceAllmenggunakan regex dan yang lainnya tidak). xD
Kevin Cruijssen
4

Julia 1.0 , 334 byte

a\b=push!(a,b)
a=pop!(a)
v(q,s=[],l=0)=(i=1;
for c in q
!r=c==r
i+=1
!')' ? (l<1 && break;l-=1) :
!'(' ? (while s[end]!=0 v(q[i:end],s) end;l+=1) :
l>0 ? continue :
!'~' ? s\rand(Int) : 
!'+' ? s\(s+√s) :
!'-' ? s\(s-√s) :
!'*' ? s\(s*√s) :
!'/' ? s\(s÷√s) :
!':' ? s\s[end] :
!'.' ? print(s[end]," ") : 0
end)

"Penerjemah" pertama saya dari jenis apa pun, lebih mudah dari yang saya harapkan. Saya melakukan beberapa golf dasar, tetapi mungkin ada ruang untuk lebih. Saya membuatnya mencetak spasi setelah output untuk. untuk mach misalnya output. Versi ungolfed ada di header di tautan TIO. Contoh penggunaan v("~:-:/").

+41 byte untuk memperbaiki bug yang ditunjukkan Night2 dengan menambahkan penghitung lingkaran. Sekarang saya mengerti mengapa transpiling adalah pilihan yang baik. Kasing uji yang baik adalah ~:-.(~:/+.)(~:/+.())~:-.dengan output yang diharapkan0 0

Cobalah online!

gggg
sumber
3

Pesona Rahasia , 266 264 byte

DS͗{r;'ui[0[0y̤<<<<<?+f2,;$"!0/"?*7≠0:S͗\
RS͗}:'~=?!\:':=?!\:'+=?!\:'-=?!\:'/=?!/:'.=?!\:'*=?!\:';=?!;:')≠3*?04B͍:'(=?!S͗
U/lA`R耀`S͗/?7  :S͗/?+f1+S͗/?3  -S͗/?3     $ '$:S͗/?7  *S͗/
U\m(d*?"SO!"$;
{:'(=?!\:')=?!\R
~/?)0l{͗/?8 {͗l}͗/U
 \}͗21B͍

Cobalah online!

Karena keterbatasan yang ada pada Runic, ia hanya dapat mendukung panjang program (dan ukuran tumpukan) ~ 50 1 . Program yang terlalu besar akan gagal. Jika tumpukan tumbuh terlalu besar, itu akan kesalahan dengan SO!(tidak diperlukan, tetapi lebih baik daripada penghentian diam; biaya 24 byte). Jika program mencoba untuk membagi dengan 0, itu akan dicetak /0!.

Kesalahan ditambahkan ke akhir output standar karena Runic tidak memiliki cara menulis ke STDERR.

Versi ini akan mendukung program-program panjang yang sewenang-wenang, tetapi masih terbatas pada setumpuk ~ 90 (dan dengan demikian kesalahan pada hasil ke-2 dari program uji pertama) dan belum golf dengan baik (peningkatan panjang perintah antara S͗}:dan S͗}͍:0%:membutuhkan beberapa spasi tambahan untuk membuat bagian berbaris, tetapi ruang ekstra itu juga memungkinkan lebih <untuk ukuran tumpukan maksimum yang lebih besar).

Atau, program ini akan menghindari ~menghasilkan nol dan program akan berakhir setelah 1 juta langkah eksekusi (perlindungan terhadap loop tak terbatas yang dibangun ke dalam penerjemah Runic). Juga termasuk beberapa byte untuk melewati kelebihan ruang NOP dan berjalan sedikit lebih lama.

  1. Stack oversize fizling terjadi di (IP mana + 10) dan cek yang saya masukkan untuk tumpukan Volatile adalah sizeof(stack) < manadan ada 5 IP yang menggabungkan dan menggabungkan mana (50 inisial). Meningkatkan nilai itu ke batas sebenarnya (+10) akan membutuhkan 2 byte lagi dan saya meninggalkan logika golf bukannya akurat.

Penjelasan

Aliran yang mudah menguap

  1. Program dimulai di area biru tengah atas di sepanjang <<<<<dan lima IP bergabung bersama diy
  2. IP bergerak ke kiri, mengatur tumpukan dan membaca input dan pindah ke bagian cyan
  3. IP bergerak ke kanan bawah baris ini memeriksa char atas pada stack untuk perintah apa itu. Baris ini berlanjut ke kanan lebih jauh dari yang terlihat. ketika instruksi yang benar ditemukan itu mengeksekusi kode pada baris di bawah ke kiri (melompati bagian lain untuk kembali ke cyan melalui biru).
  4. Bagian magenta dieksekusi selama ~atau :perintah untuk kesalahan pada Stack Overflow, bagian kuning dilewati jika tumpukan tidak terlalu penuh dan kembali melalui sampul ke biru gelap.
  5. Jauh ke kanan ketika )ditemukan program bercabang ke bagian merah dan bergerak ke kanan.
  6. Bagian ini memutar tumpukan perintah ke kanan hingga (ditemukan (lanjutkan hijau).
  7. Untuk setiap tambahan )ditemukan (lanjutkan oranye), tumpukan kedalaman tumpukan terbentur dan ketika (ditemukan, tumpukan kedalaman tumpukan muncul satu kali (lanjutkan entri hijau tua dan oranye)
  8. Jika tumpukan kedalaman kosong, teruskan ikuti hijau ke Bdan kembali ke cyan ke loop parsing utama, jika tidak bungkus dengan warna oranye> kuning-> merah (memasukkan kembali loop-reset loop).
  9. Ungu di kanan atas menangani divisi, jika nilai untuk membagi adalah 0, bagian coklat menangani kesalahan dan pemutusan. Masukkan kembali lingkaran parsing utama dengan melompati bagian cyan.
Draco tidak lagi percaya pada SE
sumber
2

PHP , 196 byte

eval(strtr($argn,[':'=>($v='$a[]=').$e='end($a);','~'=>$v.'rand();','+'=>($q=$v.$p='array_pop($a)')."+$p;",'-'=>"$q-$p;",'*'=>"$q*$p;",'/'=>"$q/$p;",'.'=>"echo' ',$e",'('=>"for(;$e){",')'=>'}']));

Input 1: Cobalah online!

Input 2 (0, 1, 2, ...): Cobalah online!

Input 3 (Divisi dengan kesalahan nol): Cobalah online!

Hanya menerjemahkan kode ke PHP dan mengevaluasinya!

Night2
sumber
2

JavaScript (V8) ,  178 172  171 byte

Transpile ke JS. Dapat melempar Z is not definedatau x is not definedjika kode mencoba melakukan sesuatu yang buruk.

s=>eval(s.replace(/./g,c=>`S.push(${c>'}'?'x=Math.random()*1e5|0':c>'9'?'x':c=='.'?');print(x':c<')'?');while(x){(0':c<'*'?')}(0':`1/(x${c}=S.pop(S.pop()))?x:Z`});`,S=[]))

Coba program 1 online!

Coba program kedua online!

Coba program ke-3 online!

Bagaimana?

Setiap instruksi dialihkan ke S.push(, diikuti oleh pola tertentu, diikuti oleh );.

Kami harus menguji divisi dengan nol secara eksplisit karena JS tidak peduli sedikit pun tentang operasi yang tidak berbahaya. :-p

arang. | Kode JS
------- + --------------------------------------
   ~ | S.push ( x = Math.random () * 1e5 | 0 );
   + | S.push ( 1 / (x + = S.pop (S.pop ()))? X: Z );
   - | S.push ( 1 / (x- = S.pop (S.pop ()))? X: Z );
   * | S.push ( 1 / (x * = S.pop (S.pop ()))? X: Z );
   / | S.push ( 1 / (x / = S.pop (S.pop ()))? X: Z );
   : | S.push ( x );
   . | S.push ( ); cetak (x );
   (| S.push ( ); while (x) {(0 );
   ) | S.push ( )} (0 );
Arnauld
sumber
2

Java 8, 420 418 402 373 359 357 341 byte

import java.util.*;s->f(s,new Stack());void f(String s,Stack<Integer>S){for(int i=0,c,t,u;i++<s.length();){if((c=s.charAt(i-1))<42&&S.peek()!=0)f(s.substring(40/c*i),S);if(c==46)System.out.println(S.peek());if(c>57)S.add(c>99?new Random().nextInt():S.peek());if(c<44|c==45|c==47){t=S.pop();u=S.pop();S.add(c<43?u*t:c<45?u+t:c<46?u-t:u/t);}}}

-2 byte terima kasih kepada @Grimy .
-16 byte berkat @ceilingcat .

Cobalah online.

Penjelasan:

import java.util.*;       // Required import for 2x Stack and Random

s->                       // Method with String parameter and no return-type
  f(s,new Stack())        //  Call the recursive function, with a new Stack

// Separated recursive method with String and Stack parameters
void f(String s,Stack<Integer>S){
  int i=0,                //  Index integer
      c,                  //  Temp integer used for the current character
      t,u;                //  Temp integers used for the peeked/popped top of the stack
  for(;i++<s.length();){  //  Loop `i` in the range [0, String-length):
    if((c=s.charAt(i-1))  //   Set `c` to the current character
        <42               //   If the character is either '(' or ')',
        &&S.peek()!=0)    //   and the top of the stack is not 0:
         f(s.substring(   //    Take the substring, either removing everything before and
            40/c*i),      //    including the "(", or keeping the string as is for ")"
           S);            //    And do a recursive call with this String
    if(c==46)             //    If the character is '.'
      System.out.println( //     Print with trailing newline:
       S.peek());         //      The peeked top of the stack
    if(c>57)              //    If the character is ':' or '~':
      S.add(c>99?         //     If the character is '~':
        new Random().nextInt()
                          //      Add a random [0,2147483647) integer to the stack
       :                  //     Else (the character is ':')
        S.peek());        //      Add the peeked top to the stack
    if(c<44|c==45|c==47)  //    If the character is '*', '+', '-', or '/':
      t=S.pop();u=S.pop();//    Pop and set the top two values to `t` and `u`
      S.add(c<43?         //     If the character is '*':
        u*t               //      Add the product of the two values to the stack
       :c<44?             //     Else-if the character is '+':
        u+t               //      Add the sum of the two values to the stack
       :c<46?             //     Else-if the character is '-':
        u-t               //      Subtract the top two values, and add it to the stack
       :                  //     Else (the character is '/'):
        u/t;}}}           //      Divide the top two values, and add it to the stack
Kevin Cruijssen
sumber
1
new Random().nextInt()2 lebih pendek dari (int)(Math.random()*1e5).
Grimmy
@ Grim Ah, lupa saya java.util.*mengimpor itu untuk Stack. Terima kasih! :)
Kevin Cruijssen
@ceilingcat Terima kasih untuk -16!
Kevin Cruijssen
Ini mungkin bertentangan dengan satu atau lebih aturan kesopanan tetapi jika Anda mengganti new Random().nextInt()dengan 5semua testcases masih lulus.
ceilingcat
@ceilingcat Ya, tapi 5tidak sepenuhnya acak ;) xkcd yang relevan
Kevin Cruijssen
2

C (gcc) untuk Linux x86_64, 675 643 621 613 597 432 404 399 byte

printf();*z;*mmap();(*p)();*j(char*a){char*t=a,*n,c;for(p=0;read(0,&c,!p);t=!~c?n=j(t+9),z=mempcpy(t,L"\xf00f883Ƅ",5),*z=n-t-9,n:!c?p=*t++=233,z=t,*z=a-13-t,z+1:stpcpy(t,c-85?c-2?c-4?c-1?c-6?c-17?"PAPTYh%ld T_P^1\xc0QH\x83\xcc\bQA\xff\xd0\\AXX":"P":L"\xfef7995e":"[\xf7\xeb":"[)\xd8":"[\1\xd8":L"\xf0c70f50"))c-=41;return t;}main(){p=mmap(0,1<<20,6,34,0,0);p(strcpy(j(p),"j<X\xf\5"),0,0,0,printf);}

Cobalah online!

Ini adalah JIT yang secara langsung menerjemahkan instruksi Volatile ke dalam bahasa mesin x86_64 dan mengeksekusi kode. Jika mesin Anda tidak memiliki rdrandinstruksi, Anda dapat menggantinyaL"\xf0c70f50" dengan "Pj*X"" PRNG yang kurang seragam ". Untuk port ke sesuatu selain Linux, ganti syscalls di printf()dan exit()gumpal dan sesuaikan parameter mmap().

EDIT: Versi ini memanggil printf()alih-alih menerapkan subset dari awal.

EDIT2: Bilangan bulat yang didukung sekarang 32 bit, bukan 64.

Sedikit kurang golf ...

printf();*z;*mmap();(*p)();
// recursive function translates Volatile commands to x86_64 instructions
*j(char*a){
  char*t=a,*n,c;
  for(p=0;read(0,&c,!p);)
    c-=41,
    t=c=='('+41?
      // cmp eax,0
      // je n-t-9
      n=j(t+9),
      z=mempcpy(t,"\x83\xf8\x00\x0f\x84",5),
      *z=n-t-9,
      n
    :
      c==')'+41?
        // jmp a-13-t
        p=*t++=233,
        z=t,
        *z=a-13-t,
        z+1
      :
        stpcpy(t,c-'~'+41?
                   c-'+'+41?
                     c-'-'+41?
                       c-'*'+41?
                         c-'/'+41?
                           c-':'+41?
                             // ; This calls printf("%ld ",%rax)
                             // push rax
                             // push r8
                             // push rsp
                             // pop  rcx
                             // push 0x20646c25
                             // push rsp
                             // pop  rdi
                             // push rax
                             // pop  rsi
                             // xor  eax, eax
                             // push rcx
                             // or   rsp, 8
                             // push rcx
                             // call r8
                             // pop  rsp
                             // pop  r8
                             // pop  rax
                             "\x50\x41\x50\x54\x59\x68\x25\x6c\x64\x20\x54\x5f\x50\x5e\x31\xc0\x51\x48\x83\xcc\x08\x51\x41\xff\xd0\x5c\x41\x58\x58"
                           :
                             // push rax
                             "\x50"
                         :
                           // pop rsi
                           // cdq  
                           // idiv esi
                           "\x5e\x99\xf7\xfe"
                       :
                         // pop rbx
                         // imul ebx
                         "\x5b\xf7\xeb"
                     :
                       // pop rbx
                       // sub eax, ebx
                       "\x5b\x29\xd8"
                   :
                     // pop rbx
                     // add eax, ebx
                     "\x5b\x01\xd8"
                 :
                   // push rax
                   // rdrand eax
                   "\x50\x0f\xc7\xf0");
  return t;
}
main(){
  p=mmap(0,1<<20,6,34,0,0);
  p(strcpy(j(p),"\x6a\x3c\x58\x0f\x05"),0,0,0,printf);
}
plafon
sumber
1

Kotlin , 412 byte

Sayangnya saya kehilangan ke Jawa, tetapi saya tidak mau import java.util.Stack(dan saya tidak yakin itu akan menutup celah pula.)

{p->var i=0
var s=List(0){0}
var c=List(0){0}
while(i<p.length){when(val o=p[i]){'~'->s+=(0..32768).random()
in "+-*/"->{val(a,b)=s.takeLast(2)
s=s.dropLast(2)+when(o){'+'->a+b
'-'->a-b
'*'->a*b
'/'->a/b
else->0}}
':'->s+=s.last()
'.'->println(s.last())
'('->{if(s.last()!=0)c+=i else{var z=0
do{if(p[i]=='(')z++else if(p[i]==')')z--
i++}while(z>0)
i--}}
')'->if(s.last()!=0)i=c.last()else c=c.dropLast(1)}
i++}}

Tidak disatukan

{ p ->                  // open lambda: p is the code string
    var i = 0           // program counter
    var s = List(0){0}  // data stack
    var c = List(0){0}  // jump stack

    // main loop
    while(i<p.length) {
        // match on the current character
        when(val o = p[i]) {
            // add random number to end of stack
            '~' -> s += (0..32768).random()
            // if a math op...
            in "+-*/" -> {
                // pick top stack items
                val (a, b) = s.takeLast(2)
                // pop two items and then push based on op
                s = s.dropLast(2) + when(o) {
                    '+' -> a+b
                    '-' -> a-b
                    '*' -> a*b
                    '/' -> a/b
                    else -> 0  // else is required here
                }
            }
            // duplicate top stack item
            ':' -> s += s.last()
            // print top stack item
            '.' -> println(s.last())
            // open loop
            '(' -> {
                if(s.last()!=0)
                    // push to jump stack if top of data stack is nonzero
                    c+=i
                else {
                    // skip ahead
                    var z=0
                    do {
                        // seek to matching brace
                        if(p[i]=='(') z++ else if(p[i]==')') z--
                        i++
                    } while(z>0)
                    // ensure program counter doesn't go too far
                    i--
                }
            }
            // close loop
            ')' -> if(s.last()!=0) i=c.last() else c=c.dropLast(1)
        }
        // next character
        i++
    }
}

Cobalah online!

siput_
sumber