pengantar
Kipple adalah bahasa pemrograman esoterik berbasis stack yang ditemukan oleh Rune Berg pada Maret 2003.
Kipple memiliki 27 tumpukan, 4 operator, dan struktur kontrol.
Tumpukan
Tumpukan diberi nama a
- z
dan berisi bilangan bulat bertanda 32-bit. Ada juga tumpukan khusus @
,, untuk membuat angka keluaran lebih nyaman. Ketika suatu angka didorong ke atas @
, nilai ASCII dari digit angka itu malah didorong sebagai gantinya. (Misalnya, jika Anda menekan 12 ke @
, itu akan mendorong 49 dan kemudian 50 ke @
.)
Input didorong ke tumpukan input i
sebelum program dijalankan. Juru bahasa akan meminta nilai untuk disimpan i
sebelum eksekusi. Setelah eksekusi selesai, semua yang ada di tumpukan o
output akan ditampilkan sebagai karakter ASCII. Karena ini adalah satu-satunya mekanisme IO Kipple, berinteraksi dengan program Kipple tidak mungkin.
Operator
Operan adalah pengidentifikasi tumpukan atau bilangan bulat 32 bit yang ditandatangani.
Dorong: >
atau<
Sintaks: Operand>StackIndentifier
atauStackIndentifier<Operand
Operator Push mengambil operan ke kiri dan mendorongnya ke tumpukan yang ditentukan. Misalnya, 12>a
akan mendorong nilai 12 ke tumpukan a
. a>b
akan memunculkan nilai teratas dari tumpukan a
dan mendorongnya ke tumpukan b
. Memunculkan tumpukan kosong selalu mengembalikan 0. a<b
sama dengan b>a
. a<b>c
muncul nilai paling atas dari b
dan mendorong keduanya c
dan a
.
Menambahkan: +
Sintaksis: StackIndentifier+Operand
Add operator mendorong jumlah item paling atas pada stack dan operan ke stack. Jika operan adalah tumpukan, maka nilainya muncul dari itu. Misalnya, jika nilai teratas tumpukan a
adalah 1, maka a+2
akan mendorong 3 ke atasnya. Jika a
kosong, maka a+2
akan mendorong 2 ke atasnya. Jika nilai stack paling atas a
dan b
1 dan 2, maka a+b
akan muncul nilai 2 dari stack b
dan mendorong 3 ke stack a
.
Mengurangi: -
Sintaksis: StackIndentifier-Operand
Operator Kurangi bekerja persis seperti operator Tambah, kecuali bahwa itu mengurangi bukan menambah.
Bersih: ?
Sintaksis: StackIndentifier?
Operator Bersihkan mengosongkan tumpukan jika item paling atas adalah 0.
Penafsir akan mengabaikan segala sesuatu yang tidak di samping operator, sehingga program berikut akan bekerja: a+2 this will be ignored c<i
. Namun, cara yang tepat untuk menambahkan komentar adalah dengan menggunakan #
karakter. Apa pun antara a #
dan karakter end-of-line dihapus sebelum eksekusi. Karakter ASCII # 10 didefinisikan sebagai end-of-line di Kipple.
Operan dapat dibagi oleh dua operator, mis. a>b c>b c?
Dapat ditulis sebagai a>b<c?
.
Program 1>a<2 a+a
akan menghasilkan yang a
berisi nilai-nilai [1 4]
(dari bawah ke atas) dan tidak [1 3]
. Begitu juga untuk -
operator.
Struktur Kontrol
Hanya ada satu struktur kontrol di Kipple: loop.
Sintaksis: (StackIndentifier code )
Selama tumpukan yang ditentukan tidak kosong, kode di dalam tanda kurung yang cocok akan diulang. Loop dapat berisi loop lain. Misalnya, (a a>b)
akan memindahkan semua nilai tumpukan a
ke tumpukan b
, meskipun urutannya akan terbalik . Cara yang identik secara fungsional, tetapi lebih elegan untuk melakukan ini adalah (a>b)
.
Contohnya
100>@ (@>o)
Ini akan menampilkan 100
33>o 100>o 108>o 114>o 111>o 87>o 32>o 111>o 108>o 108>o 101>o 72>o
Ini akan dicetak "Hello World!"
. Ketika o
tumpukan sedang di-output, ia mulai memunculkan karakter dari atas tumpukan ke bawah.
#prime.k by Jannis Harder
u<200
#change 200
k<2>m
u-2
(u-1 u>t u>z u<t
(k>e e+0 e>r)
(e>k)
m+1
m>t
m>z
m<t
t<0>z? t?
1>g
(r>b
m+0 m>a
b+0 b>w
(a-1
b+0 b>j
j?
1>s
(j<0>s j?)
s?
(s<0 w+0 w>b s?)
a>t
a>z
t>a
b-1
b>t
b>z
t>b
z<0>t? z?
a?)
b?
1>p
(b<0 b? 0>p)
p?
(p 0>r? 0>p? 0>g)
)
g?
(g m+0 m>k 0>g?)
u?)
(k>@
10>o
(@>o)
)
Ini adalah generator bilangan prima, tapi saya tidak yakin cara kerjanya.
Aturan
Anda harus menulis program / fungsi yang menafsirkan Kipple. Program / fungsi ini dapat memperoleh program Kipple melalui file sumber, atau mendapatkannya melalui STDIN langsung dari pengguna. Jika STDIN tidak tersedia, itu harus mendapatkannya dari input keyboard, dan terus mendapatkan input sampai karakter tertentu yang tidak patut dimasukkan. Misalnya, jika juru bahasa Anda ditulis dalam kode mesin x86, itu akan mendapatkan karakter program Kipple berdasarkan karakter dari keyboard, dan terus melakukannya sampai esc(atau tombol lain apa pun yang tidak memancarkan karakter yang dapat dicetak) ditekan.
Jika ada kesalahan, misalnya kesalahan sintaksis atau stack overflow, ia harus mengakuinya dengan cara tertentu, misalnya dengan mengembalikan 10 sebagai ganti 0 atau pesan kesalahan yang dihasilkan oleh penerjemah / kompiler, TETAPI TIDAK MENCETAK PESAN KESALAHAN .
Aturan reguler lainnya untuk golf kode berlaku untuk tantangan ini.
Kode Anda akan diuji dengan beberapa contoh di arsip sampel Kipple
Ini adalah kode-golf . Kode terpendek dalam byte akan menang. Semoga berhasil!
Perhatikan bahwa ada operator opsional di Kipple,, "
tetapi ini bukan bagian dari spesifikasi dan hanya fitur tambahan dalam juru bahasa resmi. Saya belum menyebutkannya di sini sehingga tidak perlu didukung dalam kiriman Anda.
Jika Anda ragu tentang bagian spesifikasi apa pun, Anda dapat memeriksanya dengan juru bahasa resmi yang ditulis dalam bahasa Jawa . Ini akan mengunduh file zip yang berisi program yang dikompilasi dan kode sumber. Ini dilisensikan di bawah GPL.
sumber
i
jika saya mengambil program sumber dari stdin?Jawaban:
C,
709702 byteSkor byte dengan baris baru (yang dapat dihapus) dihapus, tetapi untuk kemudahan membaca saya mempostingnya di sini dengan baris baru:
Kompilasi dengan
gcc -w golf.c
(-w
membungkam peringatan untuk kewarasan Anda).Mendukung semuanya kecuali
i
input, karena penanya belum menanggapi pertanyaan saya tentang bagaimana melakukannya jika Anda mengambil kode dari stdin. Itu tidak melaporkan kesalahan sintaksis.sumber
./a.out < prime.k
.Ruby, 718 byte (saat ini tidak bersaing)
aku sangat lelah
File dimuat sebagai argumen baris perintah, dan input dikirim melalui STDIN. Atau, pipa file ke STDIN jika Anda tidak perlu input dalam
i
register Anda .Karena beberapa kebingungan mengenai spesifikasi, versi saat ini tidak menangania<b>c
dengan benar, dan karenanya tidak bersaing hingga diperbaiki.a<b>c
sudah diperbaiki sekarang. Namun, itu masih mengembalikan hasil yang salah ketika menjalankan fungsi bilangan prima, sehingga masih tetap sebagai jawaban yang tidak bersaing.sumber
0 1 1 2 4 8 16...
Saya ingin tahu apakah ini kesalahan spesifikasia+0
itu omong kosong/(\((\g<1>|\s)+\)|[^()\s]+)/m
yang digunakannya untuk membagi pada token dan grup token. ( Uji pada regex101 ). Mungkin kesalahan di sisa parsing saya, tapi saya tidak tahu di mana.