Golf a Purple Interpreter
Ungu adalah esolang yang dirancang dengan dua tujuan utama:
- Untuk menjadi minimalisasi terong , karena tidak ada cukup bahasa satu instruksi yang memodifikasi sendiri sekitar.
- Untuk mengakui kemungkinan penerjemah golf yang sangat kecil . Pass pertama saya pada interpreter Python 2 dengan fitur cukup lengkap hanya 702 byte, dan saya yakin pegolf yang lebih berpengalaman bisa mencukur sedikit dari itu.
Tujuan Anda adalah menulis penerjemah untuk bahasa ini.
Informasi tentang Ungu:
Program Ungu adalah urutan karakter yang ditempatkan ke dalam array memori yang tak terbatas dan dapat dialamatkan sehingga karakter pertama dari program ditempatkan pada alamat nol. Sisa array (baik sebelum dan sesudah di mana program Ungu disimpan) diinisialisasi ke nol.
Ada tiga register dalam warna Ungu, disebut a dan b dan i , yang masing-masing dapat menyimpan bilangan bulat yang ditandatangani dan diinisialisasi ke nol. i juga penunjuk instruksi, dan selalu menunjuk ke instruksi Ungu yang sedang dijalankan.
Setiap siklus, juru bahasa akan membaca urutan tiga karakter yang berdekatan mulai dari lokasi memori yang ditunjukkan oleh penunjuk instruksi dan mencoba untuk mengeksekusi urutan ini sebagai instruksi Ungu. Setelah itu, penunjuk instruksi selalu bertambah 3.
Secara sintaksis, instruksi Ungu terdiri dari tiga karakter (atau penyandiannya) berturut-turut, seperti " xyz ".
Karakter pertama x dapat berupa salah satu dari yang berikut:
abABio
Simbol-simbol ini memiliki arti sebagai berikut:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Dua byte lain y dan z dapat berupa salah satu dari yang berikut:
abABio1
Masing-masing simbol ini memiliki arti sebagai berikut:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Setelah mengambil instruksi, penerjemah Ungu akan mengevaluasi y dan kemudian z , kurangi hasil z dari hasil y , dan kemudian lakukan tindakan yang ditunjukkan oleh x pada perbedaan.
Jika urutan tiga karakter (atau penyandiannya) bukan instruksi Ungu yang valid, penerjemah segera berhenti tanpa memberikan kesalahan apa pun.
Penerjemah Anda harus:
- Jadilah program yang lengkap, bukan fungsi.
- Jangan pernah output ke stderr, kecuali EOF dibaca .
- Berperilaku identik dengan implementasi referensi pada semua input yang terbentuk dengan baik yang tidak melibatkan jumlah yang sangat besar, termasuk program pengujian yang diberikan di bawah ini. (Yah, identik dengan waktu - itu bisa berjalan lebih lambat, tetapi tidak terlalu banyak!)
Anda dapat memberikan program kepada penerjemah dalam bentuk apa pun yang Anda inginkan: membacanya dari file, menanamkannya dalam program sebagai string, atau membacanya dari stdin.
Kasus uji:
Program
ooo
saat dijalankan dengan input
z!
harus menghasilkan
Y
Program
bbboobiii
saat dijalankan dengan input
It's a cat program.
(atau input lainnya) harus menghasilkan
It's a cat program.
(atau input apa pun yang diterima) dan kemudian mulai lagi dan lakukan hal yang sama lagi .
Program
Aoab11bi1bABoAaiba
saat dijalankan dengan input
0
harus menghasilkan
0
dan kemudian berhenti, tetapi ketika dijalankan dengan input
1
harus melanjutkan keluaran
1
selama-lamanya.
Program
b1bbb1oAbabaa1ab1Ab1Bi1b
harus menghasilkan
b1bbb1oAbabaa1ab1Ab1Bi1b
Program
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
harus menghasilkan
Hello, World!
Mencetak:
Ini adalah kode-golf , jadi sumber terpendek dalam byte, yang berpotensi dimodifikasi oleh bonus berikut, menang.
Bonus:
- -10% jika penerjemah Anda membaca nama file dari stdin atau dari argumen baris perintah dan memuat program dari file.
sumber
uint32
untuk karakter dan MAXINT untuk intsJawaban:
Pyth,
148128121 byte (atau 124 * .9 = 111.6, lihat bagian bawah)Suite uji
Kode diberikan pada baris pertama STDIN, masukan ke program Ungu pada sisa STDIN. Untuk menggunakan kode dengan baris baru, gunakan versi alternatif di bagian bawah.
Cukup bermain golf. Ini dia dengan linebreak dan lekukan untuk kejelasan:
Pada dasarnya, sebuah
#
loop melakukan eksekusi dan berhenti melalui error-break.a
danb
digabungkan menjadi satu variabel tunggalJ
,.Z
adalah penunjuk instruksi.k
adalah input ke program Ungu.H
adalah rekaman itu, direpresentasikan sebagai kamus.b
adalah hasil saat ini.Y
adalah byte pertama dari instruksi tersebut.Membaca dari file:
Berikan nama file sebagai baris pertama STDIN. Uji coba:
sumber
JavaScript (ES6), 292 byte
Penjelasan
Jawaban JavaScript selalu aneh ketika
STDIN
danSTDOUT
diperlukan ...Prompt pertama adalah input untuk string program. Setiap prompt yang dihasilkan dari
o
instruksi hanya akan membaca karakter pertama.eval
digunakan untuk mengganti frasa umum yang menyimpan beberapa byte. Tidak disatukan dan tanpaeval
program terlihat seperti ini:sumber
c="charCodeAt"
diganti dengan adilc
?array[-1] = 1
sama denganarray = { "-1": 1 }
. Keduanya dapat diakses denganarray[-1]
.Ceylon,
827792671 byteItu berperilaku sedikit berbeda dari implementasi referensi ketika program mencoba membaca input di EOF - implementasi referensi crash dengan TypeError, yang terlalu mahal untuk direproduksi di sini (dan juga kemungkinan bug), jadi ini akan mengembalikan -1 sebagai gantinya berulang kali, jika perlu).
(Ketika mencoba menulis -1 ini ke stdout, interpreter akan selesai dengan OverflowError, meskipun. Serupa akan terjadi jika Integer di luar kisaran Unicode adalah output.)
Penerjemah mengambil program sebagai argumen baris perintah pertama (pastikan untuk mengutipnya untuk shell Anda ketika berisi spasi putih atau hal-hal menarik lainnya).
Dalam Ceylon kita hanya dapat dengan mudah membaca input-bijaksana (saya kira ini akan berubah di salah satu versi berikutnya), jadi ketika
o
digunakan untuk membaca, saya membaca seluruh baris dan buffer bagian-bagian untuk penggunaan masa depan. Saya kira itu bekerja serupa dalam implementasi Python ketika terhubung ke terminal.Saat mencoba menjalankan perintah (bagian) yang bukan salah satu karakter yang valid,
nothing
akan menyebabkan AssertionError dilempar, yang kemudian kita tangkap di blok tangkap di sekitar loop utama.Saya pikir ini lebih baik menjadi tipe Pengecualian khusus (seperti AssertionError juga dapat terjadi di tempat lain jika saya memiliki bug), tetapi itu akan memakan banyak ruang, memakan sebagian besar perbaikan yang saya buat dari versi pertama.
Beberapa trik yang digunakan untuk bermain golf:
map
fungsi, dan membuat yang baru setiap kaliA
atauB
digunakan sebagai x .variable
anotasi, yang sekarangl
).E
(untuk lingkungan) dan metodes
(langkah) - semuanya sekarang terjadi di dalamrun
fungsi..integer
untuk mendapatkan codepoint karakter,.hash
memberikan hasil yang sama. Jadistring*.hash
sama denganstring.map(Character.integer)
(memberikan iterable dari codepoint dari sebuah string).is I ...
lebih pendek dariexists ...
.x
) menjadi string,"``t``"
lebih pendek darit.string
(atau, apa yang saya gunakan untuk karakter,String{t}
).Ini adalah versi yang diformat (dan dikomentari):
sumber