Brain-Flak (persilangan antara Brainf ** k dan Flak-Overstow) adalah bahasa esoterik berbasis stack. Sejak tantangan ini diposting, bahasanya telah berevolusi dan diperbarui, tetapi revisi pertama bahasa ini dikenal sebagai "brain-flak classic".
Anda harus menulis sebuah program atau fungsi yang mengambil string kode klasik Brain-Flak, dan mengevaluasinya. Ini juga akan mengambil daftar (mungkin kosong) bilangan bulat. Ada input untuk program klasik Brain-Flak.
Bahasa
Brain-Flak memiliki dua tumpukan, yang dikenal sebagai 'kiri' dan 'kanan'. Tumpukan aktif dimulai dari kiri. Jika tumpukan kosong muncul atau mengintip, itu akan mengembalikan 0. Tidak ada variabel. Saat program dimulai, setiap input didorong ke tumpukan aktif secara berurutan (sehingga input terakhir ada di atas tumpukan).
Satu-satunya karakter yang valid dalam program Brain-Flak adalah ()[]{}<>
, dan mereka harus selalu seimbang . Jika ada karakter yang tidak valid, atau tanda kurung tidak cocok, Anda mendapatkan perilaku yang tidak ditentukan. Apa pun itu valid.
Ada dua jenis fungsi: Nilads dan monad . Sebuah nilad adalah fungsi yang mengambil 0 argumen. Ini semua nilad:
()
+1.[]
-1.{}
Pop stack aktif.<>
Alihkan tumpukan aktif.
Ini digabungkan bersama ketika mereka dievaluasi. Jadi jika kita memiliki '3' di atas tumpukan aktif, cuplikan ini:
()(){}
akan mengevaluasi 1 + 1 + active.pop()
yang akan mengevaluasi ke 5. <>
mengevaluasi ke 0.
Monad mengambil satu argumen, sepotong kode Brain-Flak. Ini semua monad:
(n)
Tekan 'n' pada tumpukan aktif.[n]
Cetak 'n' sebagai int dan baris baru.{foo}
Saat active.peek ()! = 0, lakukan foo. Mengevaluasi ke 0¹.<foo>
Jalankan foo, tetapi evaluasilah sebagai 0.
Fungsi-fungsi ini juga akan mengembalikan nilai di dalamnya, jadi
(()()())
Akan mendorong 3 dan
[()()()]
Akan mencetak 3 tetapi
[(()()())]
Akan mencetak dan mendorong 3.
Ketika program selesai dieksekusi, setiap nilai yang tersisa di tumpukan aktif dicetak sebagai integer, dengan baris baru di antaranya. Nilai pada tumpukan lainnya diabaikan.
Aturan:
Program Anda harus mendukung angka dalam kisaran (-128, 127), dan ukuran tumpukan minimal 255. Jika Anda mendukung lebih besar, hebat.
Underflow / overflow tidak ditentukan.
Sampel IO:
Program kosong:
Input: Tidak Ada
Output: Tidak Ada
Tambahan. Sumber:
({}{})
Memasukkan:
2, 3
Keluaran:
5
Pengurangan. Sumber:
({}<>){({}[])<>({}[])<>}<>
Memasukkan:
2, 3
Keluaran:
-1
Perkalian. Sumber:
({}<>)<>({}[]){({}[])<>(({}))<>}<>{({}<>{})<>}<>
Memasukkan:
7, 8
Keluaran:
56
Fibonacci. Sumber:
<>((()))<>{({}[])<>({}<>)<>(({})<>({}<>))<>}<>
Memasukkan:
5
Keluaran:
13
8
5
3
2
1
1
{[({})]}
Celah standar berlaku, dan jawaban tersingkat dalam byte menang.
- ¹: Ini sebenarnya kesalahan saya.
{...}
harus mengevaluasi jumlah semua operasinya, yang merupakan IMO salah satu fitur paling keren dari brain-flak. Namun, untuk keperluan tantangan ini, asumsikan yang{...}
mengevaluasi sebagai 0.
sumber
{...}
mengevaluasi monad ?{...}
mengevaluasi ke 0. Juga, argumen didorong secara berurutan, sehingga2
didorong, lalu3
didorong, jadi ketika program dimulai, input kedua (3
) ada di atas tumpukan. Saya akan mengklarifikasi keduanya di pos.Jawaban:
Pip
-n
,15114810198 byteMengambil daftar input sebagai argumen baris perintah dan kode Brain-Flak dari (garis) stdin. Cobalah online!
Sunting: Menyimpan banyak byte pada pendekatan awal saya dengan beralih ke strategi terjemahan dan evaluasi.
Tidak diikat dan dikomentari
Versi ini juga mencakup beberapa hasil debug yang menunjukkan kode Pip yang dihasilkan dari terjemahan, serta konten tumpukan setelah eksekusi.
sumber
Brain-Flak Classic ,
127112471239 byteCobalah online!
+4 byte dari memperbaiki bug dengan kondisi di
{...}
monad, dan -36 byte dari berbagai golf.1238 byte kode, +1 byte untuk
-a
flag (yang dapat dikombinasikan dengan flag bahasa).Ini sekarang dievaluasi
{...}
sebagai nol per spesifikasi tantangan. Perhatikan bahwa Brain-Flak sendiri telah dievaluasi{...}
sebagai jumlah dari semua proses sejak perbaikan bug 7 Mei 2016 dua hari sebelum tantangan ini diposting.Kode berikut mengartikan Brain-Flak Classic dengan benar, dengan
{...}
sebagai jumlah dari semua proses. Satu-satunya perbedaan antara kedua penafsir adalah penempatan satu{}
nilad.Cobalah online!
Input (ke salah satu penerjemah) adalah program Brain-Flak Classic untuk menafsirkan, kemudian baris baru, kemudian daftar bilangan bulat yang dipisahkan oleh ruang. Tidak ada validasi yang dilakukan pada input. Baris baru diperlukan, bahkan jika program atau input kosong.
Langkah pertama adalah mem-parsing semua input, dimulai dengan tanda kurung:
Kemudian bilangan bulat diuraikan. Ini biasanya tidak diperlukan, tetapi input diambil sebagai ASCII. Ini memang memiliki garis perak, meskipun: input teks memungkinkan kita untuk menentukan tinggi tumpukan, yang menyederhanakan hal-hal ketika kita tidak memiliki akses ke nilad tinggi tumpukan.
Bilangan bulat diurai menjadi dua angka pada tumpukan kedua: satu untuk nilai absolut, dan satu untuk tanda. Ini kemudian dipindahkan kembali ke tumpukan pertama.
Tumpukan yang ditafsirkan disimpan di bawah kode pada tumpukan pertama dengan urutan sebagai berikut: tinggi tumpukan saat ini, tumpukan saat ini, tinggi tumpukan lainnya, tumpukan lainnya. Angka 0 untuk tinggi tumpukan lainnya tidak perlu ditekan pada titik ini, karena ini akan menjadi nol implisit saat pertama kali dibaca.
Representasi kode sekarang dipindahkan kembali ke tumpukan kiri. Untuk mempermudahnya nanti, kita kurangi 4 dari tanda kurung nilad, sehingga setiap operasi memiliki bilangan bulat unik dari -1 hingga -8.
Bagian utama dari program ini adalah menafsirkan instruksi. Pada awal setiap iterasi dari loop utama, instruksi saat ini adalah di atas tumpukan kiri, semuanya setelah itu di bawahnya pada tumpukan yang sama, dan semuanya sebelum itu berada di tumpukan yang tepat. Saya cenderung membayangkan ini sebagai memiliki buku terbuka ke halaman tertentu.
Setelah keluar dari loop utama, semua kode ada di tumpukan kanan. Satu-satunya hal di tumpukan kiri adalah nol dan dua tumpukan ditafsirkan. Memproduksi output yang benar adalah masalah sederhana.
sumber
{...}
, yang merupakan perilaku yang benar untuk brain-flak modern dan (saya pikir) brain-flak classic, namun saya menulis dalam tantangan yang{...}
dievaluasi sebagai 0. Anda mungkin bisa bermain golf sejumlah besar byte dengan menghapus fungsionalitas itu, meskipun akan lebih baik untuk menyimpan aslinya karena secara teknis lebih benar secara umum (hanya salah untuk tantangan ini)APL,
255257 byteIni mengambil program sebagai argumen yang tepat, dan input program sebagai argumen kiri, yaitu:
Versi tidak disatukan: di sini .
sumber
APL (Dyalog Classic) , 146 byte
Cobalah online!
satu Klasik menafsirkan yang lain :)
sumber
Python 3, 429 byte
Digunakan seperti
g('[{}{}]', 2, 3)
Ini digunakan
re.sub
untuk "mengkompilasi" sumber brain-flak ke python dan kemudian mengeksekusi python. (untuk debug, gantiexec
denganprint
untuk mendapatkan daftar kode python)Indentasi tersarang dengan benar sementara loop memakan banyak byte dalam kode.
sumber
Python, 616 byte
Instruksi:
[1,2,...]
format, lalu tekan enterPada dasarnya, apa yang dilakukan oleh program ini adalah "mengkompilasi" kode Brain-flak secara rekursif ke dalam daftar bersarang, dan secara rekursif menerjemahkan daftar itu. Mungkin ada cara untuk menggabungkan keduanya ...
Saya akan coba dan ulang logika nanti.
sumber
Perl 5.6,
419414 byteSaya telah bermain golf sedikit tetapi mungkin ada ruang untuk perbaikan. Baris baru dan tab ditambahkan di sini demi sedikit keterbacaan:
sumber
Python 2 ,
361, 348 byteCobalah online!
-13 byte disimpan berkat @Mr. Xcoder!
sumber