Stackylogic adalah bahasa pemrograman yang saya buat dalam tantangan sebelumnya: Jalankan Stackylogic . Baca posting itu untuk detail dan contoh lengkap, tetapi di sini adalah cara kerjanya diparafrasekan:
Stackylogic mengambil
0
dan1
untuk input dan output tunggal0
atau1
setelah selesai.Suatu program terdiri dari baris-baris yang hanya berisi karakter-karakter
01?
serta tepat satu<
di akhir salah satu baris. Garis tidak boleh kosong dan garis dengan<
harus memiliki minimal satu0
,1
atau?
sebelum.Berikut adalah contoh program yang menghitung NAND dari dua bit:
1 ?< 11 ? 0
Setiap baris dalam program dianggap sebagai tumpukan , dengan bagian bawah di sebelah kiri dan bagian atas di sebelah kanan. Secara implisit, ada tumpukan kosong (yaitu baris kosong) sebelum baris pertama dalam suatu program dan setelah baris terakhir.
The
<
, disebut kursor, menandai tumpukan untuk memulai ketika suatu program dijalankan. Eksekusi 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 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.
Hal utama yang harus disadari untuk tantangan ini adalah bahwa semua program Stackylogic sama dengan tabel kebenaran . Beberapa nilai boolean yang telah ditentukan adalah input dan tepat satu boolean adalah output yang ditentukan.
Jadi tugas Anda adalah menghasilkan program Stackylogic yang memuaskan atau disimulasikan, yaitu memiliki output yang sama dengan tabel kebenaran yang diberikan. Tetapi tidak jelas bahwa Stackylogic dapat mensimulasikan tabel kebenaran apa pun, jadi inilah buktinya dengan induksi :
Kasus Dasar
Dua tabel kebenaran 0-input adalah tabel yang selalu menampilkan
0
atau1
. Setara dengan Stackylogic dari tabel ini adalah0<
dan1<
masing - masing.Langkah Induktif
Asumsikan Stackylogic dapat mensimulasikan tabel kebenaran input-N. Misalkan M = N + 1.
Tabel input-M, T, dapat dinyatakan sebagai dua tabel input-N, T 0 dan T 1 , ditambah bit input tambahan B. Ketika B adalah 0, hasil dari T 0 digunakan. Ketika B adalah 1, hasil T 1 digunakan.
Misalnya, tabel kebenaran 3-input yang sesuai dengan pseudocode
if B: result = x OR y else: result = x NAND y
adalah
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
yang benar-benar dua tabel kebenaran 2-input untuk NAND dan OR ditumpuk di atas satu sama lain dengan bit B. muxing
Misalkan S 0 dan S 1 menjadi program Stackylogic yang memenuhi masing-masing T 0 dan T 1 (kita tahu ini ada berdasarkan asumsi pertama). Program S yang memenuhi T kemudian dapat dibangun sebagai:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
Pengaturan ini secara efektif mux antara S 0 dan S 1 berdasarkan bit input pertama (dari jalur
?<
). Jika ya0
, kursor akan naik yang ditambahkan0
ke posisi kursor asli S 0 , yang kemudian akan dibatasi atas dan bawah oleh tumpukan kosong, dan dengan demikian berjalan persis identik dengan S 0 asli . Demikian juga, jika1
input, kursor akan naik1
turun ke posisi kursor S 1 dan melanjutkan untuk mengeksekusi seolah-olah itu sendirian.Sebagai contoh, program Stackylogic untuk OR dan NAND adalah
? ?<
dan
1 ?< 11 ? 0
Mereka dapat digabungkan untuk disimulasikan
if B: result = x OR y else: result = x NAND y
seperti itu:
1 ? 110 ?0 00 0 ?< ?1 ?
Dengan demikian, tabel kebenaran apa pun dapat disimulasikan oleh program Stackylogic.
Tantangan
Tulis program atau fungsi yang mengambil dalam tabel kebenaran input N (N> 0) dalam bentuk daftar 2 nilai boolean N yang mewakili output tabel dalam urutan biner naik.
Format input yang masuk akal tidak masalah. misalnya untuk tabel kebenaran ATAU
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
salah satu dari gaya input ini akan baik-baik saja:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
Cetak atau kembalikan program Stackylogic yang memenuhi tabel kebenaran, yaitu memiliki output yang sama persis dengan input yang sama. Setiap program hingga yang memenuhi tabel itu adalah output yang valid. Anda tidak perlu mengikuti metode konstruksi bukti induktif. Program Stackylogic tidak perlu pendek secara optimal.
Misalnya, jika inputnya adalah 11100111
, satu output yang valid adalah
1
?
110
?0
00
0
?<
?1
?
tetapi ada banyak lainnya.
Kode terpendek dalam byte menang.
Lihat tantangan Stackylogic asli jika Anda membutuhkan juru bahasa.