Tulis penerjemah untuk 2B
Saya suka bahasa esoterik David Catt 2B, memiliki memori yang disimpan dalam rekaman di mana setiap sel adalah kaset byte yang terpisah ('subtape'). Tulis penerjemah untuk itu!
Spesifikasi Bahasa
Spesifikasi resmi dapat ditemukan di sini . Dalam spesifikasi ini, "
berarti angka dalam kisaran 0-9
( 0
ditafsirkan sebagai 10
), dan _
berarti string dengan panjang berapa pun. Setiap sel menyimpan nilai dalam kisaran 0-255
, dan overflow / underflow membungkus seperti halnya BF. (Terima kasih @ MartinBüttner). Untuk mengonversi teks menjadi angka 0-255
, gunakan kode ASCII . Karena saya tidak dapat menemukan detail tentang ini, saya akan mengatakan bahwa panjang rekaman harus 255
minimum, tetapi jika Anda tahu sebaliknya, silakan edit.
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction | Description |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0 | Zeroes the current cell and clears the overflow/underflow flag. |
| { | If the current cell is zero, jump to the matching }. |
| } | A placeholder for the { instruction. |
| ( | Read a byte from the input stream and place it in the current cell. |
| ) | Write the value of the current cell to the console. |
| x | Store the value of the current cell in a temporary register. |
| o | Write the value of the temporary register to the console. |
| ! | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ? | Performs a binary NOT on the current cell. |
| +" | Adds an amount to the current cell. |
| -" | Subtracts an amount from the current cell. |
| ^" | Moves the subtape up a number of times. |
| V" | Moves the subtape down a number of times. |
| <" | Moves the tape left a number of times. |
| >" | Moves the tape right a number of times. |
| :_: | Defines a label of name _. |
| *_* | Jumps to a label of name _. |
| ~_~ | Defines a function of name _. |
| @_@ | Calls a function of name _. |
| % | Ends a function definition. |
| #_# | Is a comment. |
| [SPACE] | Is an NOP. |
| [NEWLINE] | Is treated as whitespace and removed. |
| [TAB] | Is treated as whitespace and removed. |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
Tes
+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)
Haruskah output Hello world!
+1:i:{()*i*}
Semacam cat
program, hanya tanpa baris baru.
+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%
Pertama-tama harus menerima nama, kemudian, pada tekan Return, harus menampilkan Hello name
(di mana nama adalah apa yang dimasukkan).
Penghargaan untuk program itu diberikan kepada David Catt .
Saya sedang mengerjakan program tes penuh.
Aturan
- Celah standar dilarang
- Penerjemah Anda harus memenuhi semua spesifikasi, kecuali untuk komentar, yang tidak diperlukan.
Mencetak gol
- Ini kode-golf , byte paling sedikit menang!
- -10 byte jika penerjemah Anda menangani komentar.
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 N
ukuran 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
sumber
Jawaban:
Python2,
748736731709704691 byteIni adalah tantangan kecil yang menyenangkan, saya yakin saya bisa membuat kode ini lebih pendek (mungkin saya akan melakukannya nanti).
Implementasi ini membutuhkan label dan fungsi yang harus dinyatakan (diimplementasikan) sebelum dipanggil. Ini berfungsi dengan baik dengan dua tes yang diberikan tetapi sayangnya tidak bekerja dengan program "SayHi.2b" yang ditulis oleh penulis bahasa (bahkan setelah mengubah urutan deklarasi fungsi). Saya pikir masalah ini mungkin ada hubungannya dengan cara saya memahami sistem kaset dan subtape. Saat bergerak di sepanjang pita utama, apakah posisi pada subtape yang sesuai diatur ulang ke 0? Saat ini saya menjaga posisi pada subtape bahkan ketika bergerak pada kaset utama.
Ini versi yang lebih mudah dibaca:
Sunting: Mempertimbangkan penanganan komentar (-10 byte), memperbaiki kesalahan dengan satu kesalahan. Implementasi ini tidak mendukung panggilan fungsi bersarang (saya bisa mengimplementasikannya jika ini merupakan fitur yang diperlukan)
Sunting2: Mengubah fungsi penangan untuk melakukan penambahan, substraksi dan pergerakan sel. Lebih banyak lambda! : D ("Versi yang lebih mudah dibaca" mungkin tidak sinkron sekarang)
Edit3: Saya baru sadar bahwa menangani komentar biayanya 5 byte (dengan memperhitungkan -10). Jadi saya baru saja menghapusnya, sayang sekarang rasanya tidak lengkap.
Sunting4: memindahkan definisi n dari lambda ke var di dalam handler h ()
sumber
+a+
mungkin lebih baik untuk bergabunga
? Ini juga akan menghilangkan Anda harus menugaskannya ke var.SayHi.2b
file berfungsi. Apa yang terjadi jika diubah untuk mengatur ulang subtape ke nol secara bergiliran?