Bangun interpreter untuk bahasa palsu berbasis stack yang mendapat input, menafsirkannya, dan mengeluarkan hasilnya sebagai array angka. Itu harus berulang melalui setiap byte dan melakukan fungsi yang berbeda berdasarkan tabel ini:
0000 (0): Concatenate (Gabungkan dua angka teratas dalam tumpukan seolah-olah string. Mis: 12,5 -> 125)
0001 (1): Bertambah (Tambahkan 1 ke angka di atas tumpukan)
0010 (2): Pengurangan (Kurangi satu dari angka di bagian atas tumpukan)
0011 (3): Gandakan (Kalikan dua angka teratas dalam tumpukan)
0100 (4): Membagi (Membagi (membagi angka 2 ke atas dengan angka teratas di tumpukan)
0101 (5): Tambah (Tambahkan dua angka teratas di tumpukan)
0110 (6): Kurangi (Kurangi angka teratas di tumpukan dari yang di bawahnya)
0111 (7): Eksponen ( Hitung angka kedua-ke-atas dengan kekuatan nomor atas)
1000 (8): Modulus: (Temukan nomor kedua-ke-atas modulo yang teratas)
1001 (9): Putar Kanan (Geser tumpukan ke bawah. Nomor di bagian bawah sekarang di atas)
1010 (A): Putar ke Kiri (Geser tumpukan ke atas. Nomor di atas sekarang di bagian bawah)
1011 (B): Gandakan (Salin nomor atas sehingga muncul dua kali. Mis: 4,1 menjadi 4,1,1)
1100 (C): Gandakan ganda (Salin dua angka teratas pada tumpukan. Mis: 4, 1,2 menjadi 4,1,2,1,2)
1101 (D): Tukar (Tukar dua angka teratas di tumpukan. Mis: 4,1,2 menjadi 4,2,1)
1110 (E): Ganda Tukar (Tukar dua angka teratas dengan dua di bawahnya. Contoh: 1,2,3,4,5 menjadi 1,4,5,2,3)
1111 ( P ): Hapus / Pop (Hapus angka di atas tumpukan)
Misalnya, file yang berisi
1 1 BC 5 C 5 B 9 5 - Input (hex) | | | | | | | | | | 1 2 2 2 4 4 6 6 2 8 - Stack 2 2 2 2 4 6 6 6 2 2 4 2 4 6 4 2 2 2 2 4 2 2 2 2
akan menghasilkan [8,6,4,2]
Aturan:
- Unicode / simbol tidak apa-apa, tetapi ASCII adalah yang terbaik.
- Jadilah kreatif! Kependekan penting, tetapi kreativitas itu hebat!
- Jika byte terlalu keras, gunakan
"$iv*/+-^%><dtsz."
atau"0123456789ABCDEF"
bukannya byte yang sebenarnya. - KECEPATAN! Semakin cepat, semakin baik.
- Skor didasarkan pada reputasi, tetapi ukuran adalah faktor yang sangat besar.
Bonus:
Cobalah untuk menyelesaikan tantangan ini dengan menggunakan juru bahasa Anda yang baru dibuat sesingkat mungkin.
catatan:
Hal yang membuat tantangan ini berlawanan dengan tantangan golf kode lainnya adalah tidak ada kode untuk digunakan. Jika, katakanlah, Anda harus menulis juru bahasa, Anda bisa melihat implementasi orang lain. Dengan ini, Anda tidak bisa melakukan itu.
Saya lupa menaruh dan mengakhiri tanggal ini. Saya kira saya akan membuatnya satu bulan sejak saya membuat ini. Orang dengan suara tertinggi pada 22 Februari menang!
sumber
Jawaban:
Ruby, 67 baris pengganti regex
Saya memutuskan untuk menulis interpreter dalam regex, sambil tetap berpegang pada algoritma yang efisien.
Saya bisa saja menggunakan byte biasa, tetapi menggunakan simbol membuat kode lebih mudah dibaca menurut saya. Tentu saja, jika kita bisa mengemas dua instruksi dalam satu byte ...
Penggabungan nilai-nilai negatif menghasilkan perilaku komplemen sepuluh, yang mencerminkan representasi internal.
Divisi adalah divisi bilangan bulat dan sisanya tidak pernah negatif.
Sedangkan untuk putaran bonus, solusi terpendek yang saya buat ( 13 karakter ) adalah solusi bersih:
sumber
d
(setelahii
, stack hanya berisi2
, tidak ada yang bisa ditukar dengan), dan rotate terakhir (well, setidaknya yang pertama, yang kedua hanyalah swap yang disamarkan ... ) harus ke kiri, bukan ke kanan.perakitan x86 (di Win32)
"SPEED!" Tampaknya sangat penting di sini, dan kita semua tahu tidak ada yang mengalahkan bahasa assembly dalam hal itu. Jadi, mari kita lakukan itu dalam pertemuan!
Ini adalah implementasi bahasa dalam bahasa rakitan x86 (dalam sintaks NASM), dengan angka yang disimpan dan ditafsirkan sebagai bilangan bulat 32-bit yang tidak ditandatangani, menggunakan tumpukan x86 asli secara langsung. Stack underflow, dan overflow selama operasi aritmatika (atau pembagian dengan nol) adalah kesalahan runtime, yang menghentikan program dengan pesan kesalahan.
Untuk mengkompilasi ini, gunakan sesuatu seperti
Program menerima nama file biner yang berisi program pada baris perintah (misalnya
nexlang.exe testprg.bin
). Setelah selesai, ia mencetak isi akhir tumpukan ke output standar dalam format yang dapat dibaca manusia.Untuk membantu pengujian, simpan yang berikut ke
nex.def
:Dan kemudian tulis program NEX Anda ("tidak ada", seperti yang disebutkan dalam judul pertanyaan) menggunakan mnemonik yang didefinisikan di atas, dan kompilasi dengan sesuatu seperti
Misalnya untuk test case asli, gunakan yang berikut ini
prg.nex
:Dan akhirnya, untuk tantangan "2014", gunakan program NEX 14-byte berikut:
sumber
LEA ESI, [ESI+1]
bukanINC ESI
?GolfScript, 64 karakter
OK, jadi saya memutuskan untuk mencoba golf ini. Dan bahasa apa yang lebih baik untuk bermain golf daripada GolfScript?
Mudahnya, GolfScript sendiri sudah menjadi bahasa berbasis tumpukan dengan perintah byte tunggal, dan, sebagaimana yang terjadi, 11 dari 16 perintah Anda memetakan langsung ke perintah GolfScript bawaan. Jadi yang benar-benar perlu saya lakukan untuk menafsirkan bahasa Anda adalah dengan mengimplementasikan lima perintah yang tersisa di GolfScript dan membangun tabel terjemahan:
Kode terlihat agak menyebar, karena saya menggunakan baris baru sebagai pembatas untuk tabel terjemahan. Awal
0\
mendorong nol ke tumpukan dan memindahkannya di bawah program input. The{ }/
Loop, yang terdiri sebagian besar kode, mengambil program masukan dari tumpukan dan iterates tubuh loop atas masing-masing karakter, dan final]-1%`
mengumpulkan tumpukan ke dalam array, membalikkan itu (karena keluaran dimulai sampel Anda dari atas susun) dan tegaskan itu.Tubuh loop dimulai dengan string 16-baris tunggal yang dikutip.
n%
memisahkan string ini saat jeda baris,=
mencari substring yang sesuai dengan karakter input, dan~
mengevaluasi substring sebagai kode GolfScript.Akhirnya, berikut adalah implementasi GolfScript dari 16 perintah:
`+~
: menyatukan dua angka sebagai string)
: kenaikan(
: pengurangan*
: berkembang biak/
: bagi+
: tambahkan-
: kurangi?
: naikkan ke kekuasaan%
: modulus](+~
: putar tumpukan ke kanan])\~
: putar tumpukan ke kiri.
: duplikat1$1$
: duplikat ganda\
: swap[@]\+~\
: swap ganda;
: popSaya agak tidak senang dengan double swap - ini jelek dan jauh lebih lama daripada perintah lainnya. Rasanya harus ada cara yang lebih baik, tetapi jika demikian, saya belum menemukannya. Tetap saja, setidaknya itu berhasil.
Misalnya, menjalankan program di atas pada input (diberikan sebagai string ganda-dikutip GolfScript / Ruby / Perl / Python / dll):
menghasilkan output:
Sunting: Saya berhasil menyimpan dua karakter lagi, dengan total 62 karakter , menggunakan penyandian yang lebih kompak dari tabel terjemahan. Namun, itu semacam pengorbanan yang mudah dibaca:
Fitur-fitur penting dari versi ini termasuk
(
di awal loop, yang menggeser indeks perintah dari 0..15 ke -1..14 sehingga saya bisa menempatkan urutan panjang perintah karakter tunggal dari 1 hingga 8 di awal. dari meja. Ini memungkinkan saya untuk menyimpannya dalam string terpisah dan menghilangkan delapan baris baru yang membatasi mereka; Sayangnya, kompleksitas ekstra membuat saya enam karakter di tempat lain.sumber
+
di])\+~
Haskell
Hanya untuk bersenang-senang, saya membuat solusi yang tidak menggunakan variabel apa pun, hanya menggabungkan fungsi bersama.
sumber
Ruby,
330316 karakterSaya memutuskan untuk bermain golf. (Karena itu selalu menyenangkan.)
Bagian utama adalah ini:
Ini menerjemahkan setiap digit hex menjadi integer basis-10, dan kemudian menggunakan
[(huge array of strings)]
untuk menemukan string yang tepat yang mewakili perintah itu. Maka itueval
string itu.Catatan yang
%w[x y z]
setara dengan['x','y','z']
.Saya juga suka bagaimana Anda dapat menemukan wajah tersenyum di baris itu! Beberapa dari mereka adalah
:*
:/
:-]
:%
Contoh dijalankan:
sumber
C -
642634 karakterHanya untuk
$iv*/+-^%><dtsz.
dialek (ditambahkanq
sebagai karakter akhir, bersama dengan0
):Solusi untuk 2014 tantangan:
dididiizs>
.sumber
free(a);
. Dan, bukankah seharusnya ada<<2
direalloc
telepon?free()
memori: Pk, 228
Ada cukup banyak pengulangan dalam implementasi instruksi serupa, yang mungkin bisa direkayasa sampai batas tertentu.
sumber
C
924882622603587569562 karakterDengan baris-baris jelas dihapus (dipertahankan agar mudah dibaca).
Ini mengimplementasikan interpretasi "underflow push zero" dari komentar Jan Dvorak.
Versi golf sebenarnya berubah secara substansial dibandingkan dengan versi yang tidak disunat di sini, di bawah tekanan (selamat datang) dari jawaban baik Oberon .
Saya menemukan bahwa mengganti
switch
pernyataan yang mendukung satuif
...else
rantai memungkinkan saya untuk faktor-out semua angka dari saya kasus . Alih-alih itu menginisialisasiw
variabel menjadi 47 sehingga satu kenaikan meningkatkannya menjadi 48 (== ascii'0'
) maka setiap kenaikan hurufw
sampai kita perlu melompat ke'A'
titik mana kita menggunakan argumen makro pertama yang sebagian besar kosong yang menambahkan 7 ekstra untuk bangun ke 'A'. Versi ungolfed tidak menunjukkan favorit sayasbrk
/SIGSEGV
trik untuk mendapatkan memori "bebas" tanpa alokasi lebih lanjut.sumber
log
bahkan tidak didefinisikan.R, 428 karakter
Dengan lekukan:
Dalam aksi:
sumber
JavaScript, 685
Versi non-golf ( inti ):
Versi golf:
Contoh:
sumber
Haskell
Lari
sumber
tr
?) Maka itu menjadi mungkin.Gangguan Umum - 589
Menerima input hex tanpa spasi.
Tidak Disatukan:
sumber
PHP
itu bukan yang tercantik, tapi berhasil.
lari dari shell, mengharapkan nama file sebagai argumen pertama. itu menerima salah satu dari 3 dialek (bahkan dicampur)
perilaku tidak didefinisikan untuk indeks negatif atau hilang
sumber
PureBasic -
2821891 karakterIni adalah interpreter interaktif - tanpa file, Anda cukup memasukkan kode yang diberikan 0-9, AF, dan itu akan menjalankan perintah itu, dan ditampilkan sebagai contoh tulisan yang memperlihatkannya.
Gunakan "X" atau "Q" untuk keluar.
Ini sangat menyenangkan untuk dilakukan :)
sunting: Setelah tidur, saya pikir saya akan golf itu - saya telah meninggalkan versi yang dapat dibaca meskipun untuk referensi.
Semuanya berfungsi sama kecuali saya sudah mengeluarkan Q atau X untuk berhenti, cukup tutup jendela untuk berhenti:
sumber
Gangguan Umum - 586
Tidak disatukan
Lexically mengikat tumpukan baru dalam kode macroexpanded: tidak ada referensi ke variabel global. Juga, ini dikompilasi ke kode mesin.
Contoh
sumber
Python 2, 508 byte
Menggunakan penyandian "0123456789ABCDEF". Saya benar-benar bangga dengan hasilnya. Itu tidak membaca file, ia mendapat input dari STDIN, tetapi jika itu masalah, ia dapat dengan mudah diubah.
2 solusi untuk masalah 2014:
B11CB3A1AED0A00
(1615 byte) - Generik Concatenator.BB102CD11B513B3622E
(2019 byte) - Jauh lebih keren - Mengevaluasi ke (5 * (10-1)) ^ 2-11sumber
Python 2, 955 byte
Apa fungsi masing-masing
sumber