Saya telah memikirkan Jumper bahasa esoterik. Nanti Anda akan melihat alasannya.
- Ini beroperasi dengan memori akses-acak dengan byte sebagai sel. RAM nol diindeks dan awalnya diisi dengan nol.
- Ketika mencoba mengakses sel dengan kesalahan indeks negatif harus ditampilkan dan program dihentikan.
- Ketika mencoba membaca pada indeks yang lebih besar daripada yang terakhir, nol harus dikembalikan.
- Saat mencoba menulis pada indeks yang lebih besar dari yang terakhir, RAM harus ditingkatkan menjadi kelipatan 1024 dan sel-sel baru diisi dengan nol (secara teknis Anda dapat meningkatkan RAM bukan ke kelipatan 1024, alasannya adalah peningkatan kinerja, jadi jika biaya Anda banyak karakter Anda dapat melakukannya bukan kelipatan 1024).
- Program juga memiliki pointer ke sel dalam RAM yang awalnya nol
- Ketika program mulai menjalankan prompt untuk string input harus ditampilkan (atau mengambil input dari argumen baris perintah, terserah Anda). String input tidak boleh mengandung karakter nol (nol byte). Kemudian string input ditulis ke RAM mulai dari indeks nol.
- Ketika program berakhir menjalankan kotak dengan output program ditampilkan - isi RAM dari indeks nol ke byte nol pertama tidak termasuk.
Sekarang, bagian yang paling menarik, sintaksis.
Program terdiri dari perintah (awalan operator-unary) dan argumennya. Perintah dan argumen dapat dibatasi dengan spasi atau baris baru tetapi tidak perlu. Namun spasi di dalam argumen tidak valid, misalnya, # 2 = 4
valid, tetapi # 2 = 4 4
tidak.
Program dapat memiliki komentar di antaranya ()
. Komentar tidak dapat disarangkan - misalnya, dalam (abc(def)ghi)
komentar adalah (abc(def)
. Komentar dapat ditempatkan di mana saja.
#123
menetapkan penunjuk RAM ke 123 (bilangan bulat desimal positif atau nol).>123
meningkatkan penunjuk RAM sebesar 123 (bilangan bulat desimal positif).<123
mengurangi penunjuk RAM sebesar 123 (bilangan bulat desimal positif).=123
menulis 123 (bilangan bulat desimal 8-bit yang tidak ditandatangani) dalam sel saat ini.+123
menambahkan 123 (bilangan bulat desimal 8-bit yang tidak ditandatangani) ke sel saat ini (modulo 256).-123
kurangi 123 (bilangan bulat desimal 8-bit yang tidak ditandatangani) dari sel saat ini (modulo 256).:123
- "goto" - pergi ke perintah nomor 123 (pertama adalah 0). Anda dapat mengontrol aliran program Anda hanya dengan goto - itu harus melompat - itu sebabnya saya memutuskan untuk memanggil bahasa ini Jumper.
Jika argumen tidak ada - anggap itu adalah 1 untuk ><+-
perintah atau 0 untuk #=:
perintah.
Juga, ada pengubah perintah - ?
(awalan ke perintah), itu mengeksekusi perintah berikutnya hanya jika sel saat ini tidak nol, kalau tidak lewati perintah itu. Dapat diterapkan ke perintah apa pun.
Misalnya, ?:17
- pergi ke perintah 17 jika sel saat ini tidak nol.
Jika program tidak valid atau kesalahan terjadi selama runtime dapat ditampilkan pesan "Kesalahan". Karena ini CodeGolf, pesan singkat seperti itu akan baik-baik saja.
Tugas Anda
Tulis penerjemah terpendek untuk bahasa ini.
Beberapa program pengujian
(prints "Hello world!" regardless of input)
=72>=101>=108>=108>=111>=32>=119>=111>=114>=108>=100>=33>=
(appends "!" to the end of input string)
?:2 :4 >1 :0 =33 >1 =0
sumber
Jawaban:
Ruby, 447 byte
Membawa program dan input melalui argumen baris perintah.
EDIT: Memperbaiki beberapa bug, dan menambahkan dukungan untuk sintaks yang tidak valid dengan biaya 40 byte (sambil menambahkan beberapa optimisasi lainnya).
sumber
Python (729)
Adapun untuk menjalankan program:
Contoh:
Mungkin ada beberapa hal yang saya abaikan, jadi silakan tinggalkan komentar jika Anda mencoba sesuatu yang seharusnya berhasil tetapi tidak. Perhatikan bahwa ini ditulis dalam kode Python 2.x.
sumber
Ruby 2 -
540447420 karakterJalankan sebagai "ruby2.0 jumper.rb 'instructions' 'data inisialisasi'". 1.x Ruby tidak akan berfungsi (tidak ada metode String.bytes).
Menambahkan perintah dan komentar multi-baris dan meningkatkan penempatan saya.
Berikut ini adalah test suite dengan beberapa tes scatter-shot. Cara termudah untuk menggunakannya adalah memasukkan kode ke t / jumper.t dan menjalankan "perl t / jumper.t".
Versi tidak disatukan.
Proto-assembler quickie.
sumber
Clojure -
585577 byteTidak ada trik golf khusus yang digunakan, karena saya tidak tahu apa-apa tentang Clojure. Penerjemahnya murni fungsional. Dilengkapi dengan pesan kesalahan yang bagus jika alamat RAM negatif (kesalahan dikeluarkan, tetapi tidak ada pengecualian atau kesalahan dilemparkan).
Contoh:
Kodeasli yangsedikit tidak diubah:sumber
-
di akhir kelas karakter regex Anda, Anda tidak perlu menghindarinya. -1 karakter.CoffeeScript (465)
Kotak prompt pertama adalah untuk program dan kotak prompt kedua adalah input. Cobalah di http://coffeescript.org .
Asli :
Ini masih golf, tetapi berkomentar:
Sunting : Menambahkan spasi membutuhkan lebih banyak byte daripada yang saya kira. Penerjemah ini akan melemparkan kesalahan pada sintaks yang tidak valid, yang lain memiliki perilaku yang tidak ditentukan pada sintaks yang tidak valid.
sumber
?:2 :4 >1 :0 = 33 <10 =0
(append-! Program dengan ruang ekstra)<1
tidak<10
.Javascript, 519
Ini mendapatkan program dan input melalui kotak prompt. Menempelkan ini di konsol Javascript browser Anda akan berfungsi, serta membuang ini dalam file, menempelkan sebelum kode
<!DOCTYPE html>
, baris baru<html><head><script>
,, dan setelah kode</script></head><body></body></html>
, dan menyimpan file yang dihasilkan sebagai "swagger.html".Ini adalah upaya pertama saya dalam hal ini, dan saya sudah menyukai bahasanya. Agak. Ini benar-benar membutuhkan label teks, bukan pelabelan indeks instruksi gaya-BASIC ini.
Versi tidak digabungkan (agak):
sumber
clojure.string/replace
?:2 :4 >1 :0 = 33 <10 =0
(append-! Dengan ruang ekstra) Namun tidak diuji.C 687 GCC 4.9.0 dan Visual C ++ 2013 (jika ujung baris dihitung sebagai 1)
Sunting: Berkat Dennis sekarang jauh lebih pendek (dan berfungsi di GCC untuk mem-boot)
Versi golf
Versi yang sedikit kurang golf:
sumber
R[z]=x
diP(x)
dengan(R[z]=x)
. 2. GCC tidak memerlukan pernyataan penyertaan. 3.char C
->U C
.Groovy 582
versi tanpa ungolfed:
Saya pikir ada bug dengan komentar, yang tidak dikenali dengan benar, yang mungkin disebabkan oleh regex bodoh yang saya gunakan, tetapi 2 program berjalan sebagaimana mestinya:
sumber
Haskell: jumlah karakter yang tidak saleh
Baiklah, saat ini ini adalah sesuatu yang mungkin atau mungkin tidak akan golf segera. Ini sangat besar untuk apa itu, dengan banyak dan banyak kode yang ditulis sembarangan (sudah beberapa waktu sejak saya terakhir menyentuh Haskell). Tapi itu menyenangkan untuk ditulis.
sumber
Haskell, 584
Program input dan jumper disediakan sebagai dua baris input pertama dari stdin.
Saya akan memposting versi yang tidak di-serigala nanti, tetapi sementara itu saya ingin meninggalkan ini sebagai teka-teki untuk pembaca:
Selamat bersenang-senang!
sumber