Starry adalah bahasa pemrograman esoteris lucu di mana kode hanya terdiri dari di +*.,`'
mana perintah aktual yang diwakili oleh masing-masing karakter ditentukan oleh jumlah ruang di depannya. Itu membuatnya sulit bahkan untuk tantangan fixed-output golf, karena perintah yang berbeda dapat menjelaskan jumlah byte yang sangat berbeda. Secara khusus, literal angka memiliki representasi unary yang membuatnya perlu untuk membangun jumlah yang lebih besar dengan beroperasi pada yang lebih kecil.
Oleh karena itu, tantangan ini adalah tentang menulis program yang dapat golf program Starry tersebut.
Bagaimana cara kerja Starry?
(Beberapa detail dibiarkan tidak ditentukan pada esolang, jadi saya akan membahas perilaku penerjemah Ruby .)
Starry adalah bahasa berbasis tumpukan, dengan satu tumpukan nilai integer presisi arbitrer (yang awalnya kosong).
Satu-satunya karakter yang bermakna adalah:
+*.,`'
dan spasi. Semua karakter lain diabaikan. Setiap urutan spasi diikuti oleh salah satu karakter non-spasi tersebut mewakili instruksi tunggal. Jenis instruksi tergantung pada karakter non-spasi dan jumlah spasi.
Petunjuknya adalah:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Perhatikan bahwa interpreter memindai kode sumber untuk label sebelum eksekusi dimulai, sehingga dimungkinkan untuk melompat ke depan dan juga ke belakang.
Tentu saja, Starry juga memiliki perintah input (menggunakan ,
analog dengan .
), tetapi itu tidak relevan untuk tantangan ini.
Tantangan
Diberi string, hasilkan program Starry yang tidak mengambil input dan mencetak string itu persis ke STDOUT.
Anda dapat menulis sebuah program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter function (out).
Anda dapat mengasumsikan bahwa string tidak lebih dari 128 karakter dan hanya terdiri dari karakter ASCII yang dapat dicetak (titik kode 0x20 hingga 0x7E).
Solusi Anda harus memproses input semacam itu dalam waktu kurang dari 5 menit pada mesin desktop yang masuk akal (ada beberapa kelonggaran untuk ini; jika dibutuhkan beberapa menit lagi di laptop saya, saya tidak keberatan, tetapi jika butuh 15, saya akan mendiskualifikasi saya t).
Solusi Anda akan diuji pada sejumlah string berbeda yang tercantum di bawah ini. Skor Anda adalah jumlah total byte dari program Starry terkait. Dalam kasus seri, metagolfer terpendek menang. Artinya, jangan repot-repot bermain golf kode Anda sendiri kecuali ada dasi (yang saya pikir hanya akan terjadi jika solusi optimal mungkin).
Anda tidak boleh mengoptimalkan kode Anda terhadap kasus uji khusus yang tercantum di bawah ini. Khususnya, Anda seharusnya tidak membuat solusi kerajinan tangan untuk mereka. Mengoptimalkan kelas string yang strukturnya mirip dengan string yang diberikan baik-baik saja. Jika saya mencurigai siapa pun dari solusi hardcoding, saya berhak untuk mengganti beberapa atau semua kasus uji (dengan string struktur yang sebanding).
Uji Kasus
Setiap baris adalah test case terpisah:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
Kredit untuk test case kedua diberikan kepada Dennis . Kredit untuk test case keempat pergi ke Sp3000.
Solusi Referensi
Berikut ini adalah solusi referensi yang sangat mendasar di CJam:
q{S5*\iS*'+S'.}%
Anda dapat menjalankannya terhadap seluruh test suite di sini. Skornya adalah:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
Ini adalah pendekatan paling sederhana yang mungkin: dorong setiap titik kode karakter sebagai literal, lalu cetaklah. Itu tidak menggunakan perbedaan kecil antara karakter berturut-turut, pencetakan integer, bagian berulang string dll. Saya akan menyerahkan hal-hal itu kepada Anda.
Saya percaya ada banyak ruang untuk perbaikan. Sebagai referensi, kerajinan tangan terpendek "Halo, Dunia!" hanya sepanjang 169 byte.
JavaScript,
2515823778Sekarang kompatibel dengan ES5!
Hasil:
Awal yang bagus menurut saya, tapi jelas belum selesai. Alih-alih membuat masing-masing karakter secara terpisah, ini menambah atau mengurangi dari kode karakter sebelumnya. Saya akan menambahkan penjelasan lengkap ketika saya selesai bermain golf.
sumber
charCodeAt
.