99 (diucapkan "sembilan puluh sembilan") adalah bahasa pemrograman Esoterik yang sama sekali baru (jangan dikelirukan dengan 99 , catat huruf miring). Tugas Anda dalam tantangan ini adalah menulis penerjemah untuk 99 yang sesingkat mungkin. Kiriman dengan byte paling sedikit menang. Tiebreaker pergi ke kiriman yang diposting terlebih dahulu.
Karena pertanyaan ini sedikit lebih dalam dari biasanya, dan saya ingin sekali melihat jawaban yang bagus, saya akan memberikan hadiah 250 rep untuk jawaban favorit saya (belum tentu pemenangnya).
99 Spesifikasi
99 adalah bahasa yang sangat penting . Setiap baris dalam program 99 adalah pernyataan tunggal , dan selama eksekusi, penunjuk instruksi dimulai di baris paling atas dan melewati setiap baris berikutnya secara berurutan, mengeksekusi mereka di sepanjang jalan. Program berakhir ketika baris terakhir telah dieksekusi. Pernyataan Goto dapat mengubah rute lintasan penunjuk instruksi.
Baris baru, spasi, dan 9
hanya tiga karakter yang penting dalam program 99 . Semua karakter lain sepenuhnya diabaikan. Selain itu, spasi tambahan pada setiap baris diabaikan, dan beberapa spasi dalam satu baris dibaca sebagai satu spasi. ("Baris Baru" mengacu pada penyandian baris istirahat umum apa pun . Tidak masalah yang mana juru bahasa Anda gunakan.)
Jadi program ini:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Identik dengan program ini:
9 99 9999
9 9
Variabel
Variabel dalam 99 semuanya memiliki nama yang satu atau lebih 9
dirangkai ( 9+
dalam regex). Sebagai contoh, 9
, 99
, dan 9999999999
semua variabel yang berbeda. Secara alami, ada banyak sekali (pembatasan keterbatasan memori).
Nilai setiap variabel adalah bilangan bulat presisi bertanda tangan yang ditandatangani . Secara default, setiap variabel ditugaskan ke representasi numeriknya sendiri. Jadi, kecuali jika telah dipindahkan, nilai variabel 9
adalah angka 9, dan nilai variabel 99
adalah angka 99, dan seterusnya. Anda bisa menganggapnya sebagai memperlakukan variabel sebagai angka polos sampai mereka ditetapkan secara eksplisit.
Saya akan gunakan V
untuk merujuk pada nama variabel arbitrer di bawah ini.
Setiap contoh V
bisa diganti dengan 9
, 99
, 999
, 9999
, dll
Pernyataan
Ada lima tipe pernyataan berbeda di 99 . Setiap baris dalam program 99 berisi tepat satu pernyataan.
Sintaks yang dijelaskan di sini mengasumsikan semua karakter asing telah dihapus, semua spasi tambahan telah dihapus, dan semua urutan banyak spasi telah diganti dengan spasi tunggal.
1. Tidak Ada Operasi
Baris kosong adalah no-op . Tidak melakukan apa-apa (selain menambah pointer instruksi).
2. Keluaran
V
Variabel tunggal V
pada baris mencetak variabel itu ke stdout.
Jika V
memiliki angka ganjil dari 9
( 9
,, 999
dll.) Maka nilai integer V
dibagi 9 akan dicetak (dalam desimal).
Jika V
memiliki angka genap 9
( 99
,, 9999
dll.) Maka karakter ASCII dengan kode V
dibagi 9, mod 128 akan dicetak. (Itu (V / 9) % 128
, nilai dari 0 hingga 127.)
Contoh : Program
9
9999
akan dicetak 1W
. Baris pertama mencetak 1
karena 9/9 adalah 1. Baris kedua mencetak W
karena 9999/9 adalah 1111, dan 1111 mod 128 adalah 87, dan 87 adalah kode karakter untuk W
.
Perhatikan bahwa jeda baris tidak dicetak di antara token output. \n
perlu dicetak secara eksplisit untuk jeda baris.
3. Input
V
Variabel tunggal V
pada baris dengan spasi terdepan mengambil input dari stdin dan menyimpannya dalam variabel itu.
Jika V
memiliki jumlah ganjil 9
maka pengguna dapat mengetikkan bilangan bulat apa pun yang ditandatangani, dan V
akan disetel ke 9 kali dari nilai itu.
Jika V
memiliki angka genap 9
maka pengguna dapat mengetikkan karakter ASCII apa pun, dan V
akan ditetapkan hingga 9 kali kode karakternya.
Contoh : Diberikan -57
dan A
sebagai input, program ini
9
9
99
99
akan menghasilkan -57A
. Secara internal, variabel 9
akan memiliki nilai -513, dan 99
akan memiliki nilai 585.
Penerjemah Anda dapat mengasumsikan bahwa input selalu valid secara sintaksis.
4. Penugasan
Pernyataan ini bisa lama sewenang-wenang. Ini adalah dua atau lebih variabel pada suatu garis, dipisahkan oleh spasi:
V1 V2 V3 V4 V5 ...
Ini menetapkan jumlah semua dengan indeks genap, dikurangi jumlah dari dengan indeks ganjil (tidak termasuk ). Tugas adalah berdasarkan nilai, bukan dengan referensi.V1
V
V
V1
Ini dapat diterjemahkan dalam sebagian besar bahasa sebagai .V1 = V2 - V3 + V4 - V5 + ...
Jadi, jika hanya ada dua variabel, itu tugas normal:
V1 V2
→ V1 = V2
Jika ada tiga, maka itu pengurangan:
V1 V2 V3
→ V1 = V2 - V3
Dan tanda +
/ -
terus berpindah-pindah dengan setiap variabel tambahan:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Contoh : Program ini akan menampilkan 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Goto (melompat jika semuanya nol)
Pernyataan ini juga bisa panjang sewenang-wenang. Ini adalah dua atau lebih variabel pada garis, dipisahkan oleh spasi, dengan spasi terkemuka :
V1 V2 V3 V4 V5 ...
Jika beberapa nilai selain itu bukan nol, maka ini berlaku seperti no-op. Penunjuk instruksi dipindahkan ke baris berikutnya seperti biasa.V1
Jika semua nilai-nilai selain yang nol, maka instruksi pointer dipindahkan ke baris nomor . Garis-garis diindeks nol, jadi jika nol, maka penunjuk bergerak ke baris atas. Program berakhir (biasanya, tanpa kesalahan) jika negatif atau lebih besar dari indeks tertinggi yang mungkin (jumlah garis minus satu).V1
V1
V1
V1
Catatan yang tidak dibagi dengan 9 di sini. Dan karena tidak mungkin memiliki variabel menjadi nilai yang bukan kelipatan dari 9, hanya nomor baris yang merupakan kelipatan dari 9 yang dapat dilompati.V1
Contoh:
Program ini akan mencetak 1
selamanya:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Program ini
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
akan menampilkan angka 11 hingga 1, dalam urutan menurun, dikelilingi oleh G
:
G11G10G9G8G7G6G5G4G3G2G1G
detil tambahan
Interpreter ideal akan dijalankan dari baris perintah dengan nama file program 99 sebagai argumen. I / O juga akan dilakukan dengan cepat di baris perintah.
Anda dapat, bagaimanapun, hanya menulis fungsi juru bahasa yang mengambil dalam program sebagai string serta daftar token input (misalnya ["-57", "A"]
). Fungsi harus mencetak atau mengembalikan string keluaran.
Cara yang sedikit berbeda dalam menjalankan juru bahasa dan menangani I / O baik-baik saja jika opsi ini tidak mungkin dalam bahasa Anda.
Bonus: Tulis sesuatu yang keren di 99 dan saya akan dengan senang hati memasukkannya di posting ini sebagai contoh.
- Berikut adalah Pastebin dari program "99 Bottles of Beer" yang rapi dari jawaban Mac .
Semoga Anda menikmati tantangan ke-99 saya ! : D