Tantangan ini diposting sebagai bagian dari tantangan LotM April 2018
Brain-Flak adalah bahasa turing-tarpit yang telah mendapatkan cukup banyak ketenaran di PPCG. Memori bahasa ini disusun oleh dua tumpukan, tetapi tumpukan ketiga "tersembunyi" ditemukan oleh Wh e di Wizard , yang mengarah ke beberapa cara baru yang menarik untuk memikirkan program Brain-Flak.
Jadi, bagaimana dengan memberikan tumpukan ketiga tersembunyi yang miskin lebih banyak visibilitas? Mari kita membuat bahasa di mana tumpukan ketiga memiliki pengakuan yang layak! Di sini saya hadir Anda Third-Flak .
Bahasa
Di Third-Flak hanya ada satu tumpukan, disebut tumpukan ketiga. Operator bekerja di tumpukan ketiga dengan cara yang sama mereka lakukan di Brain-Flak, tapi di sini tidak ada []
, {}
, <>
nilads dan tidak ada {...}
monad (sehingga karakter hanya diterima dalam program Ketiga-Flak adalah ()[]<>
). Inilah yang dilakukan oleh setiap operator (contoh akan diberikan mewakili tumpukan ketiga dengan daftar di mana elemen terakhir adalah bagian atas tumpukan):
()
adalah satu-satunya operator dua karakter di Third-Flak. Ini meningkatkan bagian atas tumpukan ketiga dengan 1. Contoh:[1,2,3]
→[1,2,4]
(
,[
,<
: Semua kurung pembuka yang tidak tercakup oleh kasus sebelumnya mendorong0
ke tumpukan ketiga. Contoh:[1,2,3]
→[1,2,3,0]
)
muncul dua elemen dari tumpukan ketiga dan mendorong kembali jumlah mereka. Contoh:[1,2,3]
→[1,5]
]
muncul dua elemen dari tumpukan ketiga dan mendorong kembali hasil pengurangan yang pertama dari yang kedua. Contoh:[1,2,3]
→[1,-1]
>
muncul elemen dari tumpukan ketiga. Contoh[1,2,3]
→[1,2]
Dan berikut ini adalah aturan bahasa lainnya:
Pada awal eksekusi, tumpukan ketiga hanya berisi 0 tunggal.
Dilarang memiliki bagian yang kosong
[]
atau<>
di dalam suatu program (mereka toh akan menjadi noops jika mengikuti semantik Flak Ketiga, tetapi mereka sebenarnya memiliki arti yang berbeda dalam Brain-Flak yang tidak mungkin dibuat ulang di sini).Tanda kurung harus selalu seimbang, kecuali fakta bahwa tanda kurung penutup di akhir program bisa hilang. Sebagai contoh,
[()<(()
adalah program Third-Flak yang valid (dan stack ketiga di akhir program adalah[1,0,1]
).Suatu program hanya dapat berisi enam karakter yang diizinkan
()[]<>
. Program dijamin tidak kosong.
Catatan: ini tersirat oleh aturan sebelumnya bahwa Anda tidak perlu berurusan dengan situasi di mana Anda harus keluar dari tumpukan kosong.
Tantangan
Sederhana, tulis penerjemah untuk Third-Flak. Program Anda harus mengambil sebagai input program Third-Flak dan kembali sebagai keluaran status tumpukan ketiga di akhir program.
Format output Anda fleksibel selama dimungkinkan untuk secara jelas membaca dari situ tumpukan ketiga dan angka yang sama selalu dikodekan dengan cara yang sama (Ini hanya cara untuk mengatakan bahwa format output apa pun yang bukan cara yang terang-terangan) untuk mencoba curang tidak masalah).
Pilihan output Anda dapat membatasi rentang angka yang dapat Anda kelola selama ini tidak meremehkan tantangan (karena ini akan menjadi celah default ).
Uji kasus
Untuk setiap kasus uji, baris pertama adalah input, dan baris kedua tumpukan output diwakili sebagai daftar angka yang dipisahkan dengan spasi di mana bagian atas tumpukan adalah elemen terakhir.
[()<(()
0 1 0 1
[((((()()()()()))
0 0 0 5
((([()][()][()])))
-3
[<<(((()()()())(((((
0 0 0 0 0 4 0 0 0 0 0
[()]<(([()])><[()]
-1 0 -1
(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(()()()()())(())(())(())(())(())(())(()())(())(())(())(()())(()()()())(())(()()()()())(()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(())(())(()())(())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()())(()())(())(()()()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(())(())(())(()()())(())(())(()()())(())(())(()()())(())(()()()()())(()())(()()()()())(()()())(())(()()())(())(())(())(()())(()()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(())(())(())(()()())(())(())(())(()())(())(()())(()()()())(())(())(()()()()())(()())(()())(())(()()())(())(())(())(())(()()())(()())(())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(()()()()())(()()()()())(())(()()())(())(())(()())(())(()()()()())(())(()()()()())(())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(()()()()())(())(()()()()())(())(())(())(()())(())(()()()()())(())(())(()())(())(()())(())(()())(()())(()())(()())(())(()()()()())(()())(())(()()()()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(())(()()())(())(())(())(()())(()()()())(())(())(()())(())(()()()()())(())(())(()()()()())(())(())(()()()()())(())(())(()())(())(()())(())(()())(())(()())(())(()())(()())(()())(()())(()())(()())(())(()()())(())(())(()())(())(()()()()())(()())(()()()()())(()()())(())(())(()())(())(())(()()()()())(()()()())(()())(()())(()()())(())(()())(())(()()()()())(()())(()()()()())(())(())(())(()()()())(()()()())(()()
718 2
[()]
langgar aturan bahwa kita tidak perlu khawatir muncul dari tumpukan kosonge
ada di sini .Jawaban:
Brain-Flak , 276 byte
Cobalah online!
Anda harus tahu ini akan datang.
sumber
Retina 0.8.2 ,
644846 byteCobalah online! Mengeluarkan tumpukan dari bawah ke atas. Hanya berfungsi dengan bilangan bulat non-negatif, dan kotak uji terakhir terlalu lambat, sehingga tautannya hanya mencakup tiga kotak uji. Penjelasan: Tumpukan secara implisit mendahului program, sehingga dimulai sebagai string kosong, yang mewakili nol tunggal. The
()
nilad adalah berubah menjadi_
yang digunakan untuk menghitung dalam unary, sedangkan kurung terbuka lainnya berubah menjadi baris baru yang mendorong nol ke stack seperti yang ditemui. Kurung tutup kemudian diproses satu per satu sehingga tumpukan akan benar; yang)
menghapus baris sebelumnya, menambahkan atas dua elemen bersama-sama,]
menghapus elemen atas dan cocok dari elemen sebelumnya pada stack sehingga mengurangkan itu, dan>
hapus saja elemen teratas. Akhirnya tumpukan dikonversi ke desimal. Sunting: Disimpan 2 byte berkat @Leo.sumber
$3
? (jawaban yang bagus, sih!)Python 3 ,
145 144 132 122 116 109104 byte-7 byte terima kasih kepada Leo!
Dan - 5 terima kasih untuk Lynn!
Cobalah online!
Implementasi standar yang cantik.Tapi tidak bisa dibaca sekarang. Saya kecewa saya tidak bisa menemukan cara yang lebih pendek untuk memeriksa antara tanda kurung awal dan akhir.Beberapa upaya satu kalimat:
124 byte (fungsi anonim):
115 byte (program penuh):
Tambah lebih mengganggu daripada tugas biasa
sumber
~-']>)'.index(i)
bisa(2-ord(i)%5)
untuk menyimpan 4 byte.Ruby ,
9891 byteCobalah online!
Kode awal saya bekerja sama dalam semangat untuk menjawab Python Jo King, sehingga sebelum perulangan melalui karakter sumber kami mengganti semua
()
substring dengan karakter lain, sebagai operator yang berbeda.Namun, setidaknya di Ruby, ternyata pegolf tidak melakukan ini, tetapi lebih memilih pendekatan yang sedikit lebih rumit. Di sini, kami mempertahankan pengindeks tambahan
i
melacak posisi kami di string sumber, dan setiap kali braket pembuka ditemui, kami melakukan lookahead memeriksa apakah karakter kami saat ini + berikutnyas[i,2]
membentuk()
operator. Dalam hal ini kami mendorong 1 bukannya 0 di atas tumpukan, dan biarkan penutup)
melakukan tugasnya di langkah berikutnya.sumber
05AB1E , 25 byte
Cobalah online!
Penjelasan
sumber
SOGL V0.12 , 34 byte
Coba Di Sini!
sumber
R ,
182177 byteCobalah online!
Mengembalikan tumpukan, tempat bagian atas tumpukan lebih dulu dan bagian bawah tumpukan adalah yang terakhir.
Bertukar
()
dengan7
dan kemudian menghitung poin kode mod 8 untuk mendapatkan nilai numerik yang berbeda, yang lebih mudah dan lebih cocok untuk bermain golf daripada string.Ini golfier untuk bekerja dengan awal vektor dalam R, jadi kami membangun stack dengan cara itu.
Kemudian ia melihat
)
, atau kapank==1
, ia menambahkan nol ekstra ke bagian atas tumpukan karena pemain golf menambahkannya dan menghapusnya.sumber
CJam , 29 byte
Cobalah online!
sumber
Ceylon,
285266 bytesCobalah online!
(Disimpan 19 byte karena saran oleh Leo.)
Diformat dan dikomentari:
Cobalah online!
sumber