Stackylogic adalah bahasa pemrograman berbasis logika yang saya buat yang menerima 0
dan 1
memasukkan untuk input dan output tunggal 0
atau 1
setelah selesai.
Program Stackylogic terdiri dari garis-garis yang hanya dapat berisi tiga karakter 01?
serta tepat satu <
di akhir salah satu baris. Garis tidak boleh kosong dan garis dengan <
harus memiliki minimal satu 0
, 1
atau ?
sebelum.
Berikut adalah contoh program yang (seperti akan saya jelaskan) menghitung NAND dari dua bit:
1
?<
11
?
0
Setiap baris dalam program Stackylogic dianggap tumpukan , dengan bagian bawah di sebelah kiri dan bagian atas di sebelah kanan. Secara implisit, ada tumpukan kosong (baris kosong) sebelum baris pertama dalam suatu program dan setelah baris terakhir.
The <
, yang akan kita panggil kursor , menandai tumpukan untuk memulai ketika program Stackylogic dijalankan. Eksekusi program Stackylogic berlangsung sebagai berikut:
Lepaskan karakter teratas dari tumpukan yang saat ini ditunjuk kursor.
- Jika karakternya adalah
?
, minta pengguna untuk0
atau a1
dan bertindak seolah-olah itu adalah karakter. - Jika karakternya adalah
0
, pindahkan kursor satu tumpukan ke atas (ke garis di atas garis saat ini). - Jika karakternya adalah
1
, pindahkan kursor satu tumpukan ke bawah (ke garis di bawah garis saat ini).
- Jika karakternya adalah
Jika tumpukan kursor bergerak kosong, output nilai terakhir yang muncul dari tumpukan (selalu a
0
atau1
), dan akhiri program.Lain, jika tumpukan kursor bergerak ke tidak kosong, kembali ke langkah 1 dan ulangi prosesnya.
Perhatikan bahwa program Stackylogic selalu berakhir karena mereka akhirnya harus menguras tumpukan mereka.
Contoh NAND
Dalam program NAND kursor dimulai pada ?
:
1
?<
11
?
0
Kami akan menganggap input pengguna 1
setelah ?
muncul, yang berarti kursor akan turun, membuat program terlihat seperti ini:
1
11<
?
0
Sekarang sebuah dataran 1
berada di bagian atas tumpukan kursor. Ini muncul dan kursor bergerak lagi:
1
1
?<
0
Sekarang anggap input pengguna 0
untuk ?
, yang berarti kursor akan naik:
1
1<
0
Sekali lagi, a 1
ada di tumpukan kursor sehingga kursor muncul dan bergerak ke bawah:
1
<
0
Akhirnya tumpukan kursor kosong, sehingga nilai terakhir muncul 1
,, adalah output dan program berakhir.
Ini akurat untuk gerbang NAND karena 1 NAND 0
ini 1
. Ini tentu saja berfungsi untuk tiga input dua bit lainnya jika Anda ingin memeriksanya.
ATAU Contoh
Program Stackylogic ini mensimulasikan gerbang OR :
?
?<
Sangat mudah untuk melihat bahwa input awal 1
akan mendorong kursor ke tumpukan kosong implisit di bawah baris terakhir, mengakhiri program dan mengeluarkan 1
yang baru saja input.
Untuk input 00
di sisi lain, kursor akan membuat jalan ke tumpukan kosong implisit di atas, mengakhiri program dan mengeluarkan yang terakhir 0
menjadi input.
Tantangan
Tulis program atau fungsi yang menggunakan program Stackylogic sebagai string dan menjalankannya, mencetak atau mengembalikan hasilnya 0
atau 1
.
Setelah ?
itu, Anda dapat meminta pengguna untuk input 0
atau 1
, atau membaca nilai dari string preset 0
's dan 1
yang juga Anda ambil sebagai input. (Ini bisa menjadi input string lain untuk program / fungsi Anda atau Anda bisa saja menganggap baris pertama atau terakhir dari string program akan menjadi aliran input).
Anda dapat mengasumsikan program dan input selalu terbentuk dengan baik. Anda dapat mengasumsikan program input datang dengan satu baris baru (meskipun ingat selalu ada tumpukan kosong implisit di akhir).
Kode terpendek dalam byte menang.
Lebih Banyak Contoh Program
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
sumber
?\1?<\??
. Atau, inilah implementasi 5-line simetris:?\?0\?<\?1\?
1\???<\0
.111\???????<\000
.Jawaban:
Retina ,
79787368666563625544 byteHitungan byte mengasumsikan penyandian ISO 8859-1.
Input melalui STDIN dan diharapkan menjadi input pengguna yang dipisahkan oleh dua linefeeds dari kode sumber.
Cobalah online! (Dua baris pertama memungkinkan suite uji, di mana setiap baris adalah test case terpisah dengan
/
bukannya linefeeds.)Saya tidak sepenuhnya yakin apa yang terjadi di sini.
Ini terasa seperti solusi yang benar-benar kikuk danini sebenarnya bukan jenis masalah yang dibuat oleh Retina tetapi masih mengalahkan semua jawaban saat ini untuk beberapa alasan.Penjelasan
Versi terakhir ini sebenarnya cukup sederhana.
Tahap pertama hanyalah sebuah loop (karena
+
opsi) yang melakukan penafsiran bahasa yang sebenarnya. Panggung adalah substitusi regex tunggal, tetapi sebenarnya itu adalah tiga substitusi berbeda yang diperas dalam satu tahap, dengan memanfaatkan fakta bahwa menangkap grup dari cabang yang tidak digunakan hanya dianggap kosong selama substitusi.Pengolahan
?
:Ini hanya mengambil karakter pertama dari input, kemudian mencocokkan karakter arbitrer sampai ditemukan
?<
, dan menempatkan karakter pertama di depan<
(menghapus?
).Pengolahan
0
:Ini cocok dengan baris sebelum a
0<
dan meletakkannya setelah<
penghapusan0
. (Secara efektif, ini hanya menghapus0
dan memindahkan<
satu baris ke atas.)Pengolahan
1
:Hampir sama, kecuali bahwa kita memindahkan
<
satu baris ke bawah sambil menghapus a1
. Satu detail penting yang perlu diperhatikan adalah penggunaan+
alih-alih*
, yaitu, kami meminta baris berikutnya tidak kosong.Bagian yang menarik adalah mencari tahu mengapa ini bekerja dan mengapa kita tidak perlu melacak nilai terakhir yang kita muncul untuk menentukan hasil akhir. Untuk melakukan itu, kita perlu mempertimbangkan bagaimana loop di atas dapat berakhir. Karena setiap kecocokan yang mungkin mengubah string (karena setidaknya satu karakter dikeluarkan darinya), kita hanya perlu mempertimbangkan kasus-kasus di mana kecocokan itu gagal sama sekali.
Jika karakter di depan
<
adalah?
satu-satunya cara agar pertandingan gagal adalah bahwa tidak ada karakter non-linefeed di depannya, tetapi itu tidak dapat terjadi karena kami dijamin selalu ada input yang cukup.Jika karakter di depan
<
adalah0
, regex akan selalu cocok, karena selalu ada baris lain di atas yang sekarang (yang mungkin merupakan baris kosong yang memisahkan input dari kode sumber).Jika karakter di depan
<
adalah1
, regex akan gagal jika salah kita berada di baris terakhir (sejak¶
akan gagal untuk mencocokkan) atau jika baris berikutnya kosong (karena.+
akan gagal untuk mencocokkan). Perhatikan bahwa kedua kasus tersebut terkait dengan penghentian program setelah muncul1
.Akhirnya, ada juga kemungkinan yang
<
tidak didahului oleh apapun?01
. Ternyata kita hanya dapat mencapai situasi ini dengan muncul0
dan bergerak ke baris kosong, sehingga<
sekarang didahului oleh umpan baris.Jadi, ketika program berakhir pada
1
,<
masih akan setelah itu1
. Tetapi jika program berakhir pada a0
, itu akan pindah ke baris kosong. Kami dapat dengan mudah mengubah informasi ini menjadi output yang diinginkan dengan tahap pertandingan sederhana:Ini hanya menghitung kecocokan
1<
dalam string. Dengan alasan di atas ini akan terjadi1
jika program diakhiri pada1
, dan0
jika diakhiri pada a0
.sumber
Cembung ,
10295 byteNah, bahasa berbasis daftar tumpukan yang dikodekan dalam bahasa berbasis tumpukan ternyata cukup sulit.
Tandai kata-kata saya: Saya akan mendapatkan ini hingga 100 byte atau kurang!EDIT: Sukses!Cobalah online!
Input program melalui argumen baris perintah. Input
0
s dan1
s normal (pada TIO, ini berarti baris baru dipisahkan dalam kotak "input").Penjelasan:
Semua kode dapat dibagi menjadi tiga bagian:
Bit ini hanya mengambil program input dan mengubahnya menjadi array baris, dan juga menambahkan
" "
baris ke awal array. Karena array Convex membungkus, hanya memiliki tumpukan kosong di awal akan dilakukan.Bagian ini menentukan garis (atau tumpukan) apa yang akan mulai dieksekusi. Itu mencari melalui setiap baris dan menempatkan nomor tumpukan yang benar ke dalam
M
variabel.Ini bagian yang menyenangkan! Terus loop sampai mencapai garis dengan hanya spasi (
" "
) di atasnya (melambangkan tumpukan kosong). Jika saluran tidak kosong, ia melakukan hal berikut:?
, ambil input dan tambahkan karakter itu ke baris.0
, pindahkan penunjuk garis ke atas.1
, pindahkan penunjuk garis ke bawah.(spasi), cetak item yang baru saja muncul dan akhiri program.
sumber
Kode mesin x86 32-bit, 70 byte
Dalam hex:
Input adalah string multi-line NULL-dihentikan (dipisahkan linefeed) dilewatkan melalui ESI. Input pengguna diasumsikan sebagai baris pertama. Mengembalikan '0' / '1' di AL.
Membongkar:
sumber
JavaScript (ES6), 136
138Dengan asumsi baris baru mengakhiri dalam program
Kurang golf
Uji
sumber
05AB1E ,
58565553515046 byteDisimpan 2 byte berkat Emigna ! Kode:
Menggunakan pengkodean CP-1252 . Cobalah online! .
sumber
Python 3,
147146145144 byte1 byte terima kasih kepada @Lynn.
sumber
Python 3, 318
Sebagai program, z menjadi input. Ya, nama variabel saya gila.
sumber
ES6, 190 byte
Gunakan seperti
f(program, input)
sumber
[...o]
bukano.split``
, dan gunakanfor
bukanwhile
, karena itu memungkinkan Anda memindahkan dua ekspresi ke dalamfor
menyimpan dua byte. Beberapa tips spesifik: Saya pikir paraNumber
pemain Anda tidak perlu, seperti yang*2
akan dilemparkan untuk Anda, dan saya hanya akan membacai
menggunakanj=0
dani[j++]
yang saya pikir menghemat 11 byte.f=
, fungsi anonim diizinkan.Java,
256255231219215213 byteDemo di Ideone.
Mengambil program dan input sebagai argumen dan mengembalikan hasilnya sebagai integer.
sumber
for
lingkaran, tetapi apa arti komentar pertama Anda?int f(String[]I)...
dan Anda dapat menghindariString[]p=I.split("\n");
int f(String[]P)
->(String[]I){...
PHP (<7.0),
195192 byteMengambil program sebagai argumen pertama dan setiap nilai sebagai argumen tambahan.
Perhatikan bahwa saya menguji ini dengan spasi asn split ("", ..) daripada baris baru tetapi seharusnya tetap bekerja.
Memberikan pemberitahuan yang sudah usang jika dijalankan di php> 5.3.
Juga memberikan peringatan jika Anda keluar dari bagian atas program. Namun masih bekerja dan menghasilkan dengan benar sehingga tidak masalah.
sumber
C,
264249244242C tidak begitu baik dalam memanipulasi string, tetapi ini cukup singkat.
Ini bekerja dengan memindai string untuk kursor (
<
), bergerak mundur 1 tempat, membaca perintah, menggantinya dengantab
karakter, dan bergerak maju atau mundur satu baris. Input dalam bentuk array char C, sepertichar array[]="1\n?<\n11\n?\n0";result = f(array);
, meskipun carriage return juga diizinkan.Meskipun string input dimodifikasi, panjangnya tidak berubah.
Program uji
Jalankan program ini dengan setiap test case sebagai parameter terpisah, menggunakan backslash tunggal sebagai pengganti baris baru. Kasing uji akan dipisahkan oleh garis kosong.
sumber