Kelanjutan dari tantangan ini karena penulis telah pergi dan pertanyaannya sudah ditutup.
Yang perlu Anda lakukan adalah membuat parser Boolean.
Ekspresi Boolean, jika Anda belum pernah mendengarnya, memiliki dua input dan satu output.
Ada empat "gerbang" dalam aritmatika boolean, yaitu:
- ATAU (diwakili oleh
|
) (operator biner, di antara argumen) - DAN (diwakili oleh
&
) (operator biner, di antara argumen) - XOR (diwakili oleh
^
) (operator biner, di antara argumen) - TIDAK (diwakili oleh
!
) (operator unary, argumen di sebelah kanan)
Gerbang ini beroperasi pada input mereka yang benar (diwakili oleh 1
) atau salah (diwakili oleh 0
). Kami dapat mendaftar input yang mungkin ( A
dan B
dalam hal ini) dan output ( O
) menggunakan tabel kebenaran sebagai berikut:
XOR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|0
OR
A|B|O
-----
0|0|0
0|1|1
1|0|1
1|1|1
AND
A|B|O
-----
0|0|0
0|1|0
1|0|0
1|1|1
NOT
A|O
---
0|1
1|0
Contoh input akan 1^((1|0&0)^!(1&!0&1))
, yang akan mengevaluasi ke:
1^((1|0&0)^!(1&!0&1))
=1^(( 1 &0)^!(1&!0&1))
=1^( 0 ^!(1&!0&1))
=1^( 0 ^!(1& 1&1))
=1^( 0 ^!( 1 &1))
=1^( 0 ^! 1 )
=1^( 0 ^ 0 )
=1^0
=1
Outputnya adalah 1
.
Detail
- Seperti terlihat dalam contoh, tidak ada urutan prevalensi. Semua dievaluasi dari kiri ke kanan, kecuali ketika di dalam tanda kurung, yang harus dievaluasi terlebih dahulu.
- Input hanya akan berisi
()!^&|01
. - Anda dapat memilih karakter 8-byte untuk mengganti 8 karakter di atas, tetapi karakter tersebut harus memiliki pemetaan 1-ke-1 dan harus dinyatakan.
- Secara khusus, fungsi
eval
ini tidak diperbolehkan untuk digunakan pada string apa pun yang berasal dari input . Secara khusus, fungsiinput
(atau yang setara dalam bahasa) dan fungsi apa pun yang memanggilnya tidak dapat digunakan oleheval
. Anda juga tidak dapat menyatukaninput
ke dalam string Anda di dalameval
.
Mencetak gol
Ini adalah kode-golf . Solusi terpendek dalam byte menang.
code-golf
parsing
logic-gates
Biarawati Bocor
sumber
sumber
Jawaban:
JavaScript (ES6) 116 byte
edit thx @ user81655 selama 3 byte disimpan dan bug ditemukan
Mungkin bukan pendekatan terbaik, tapi tidak ada operator eval dan tidak ada boolean, hanya tabel kebenaran.
Karakter yang digunakan:
Uji
sumber
x>7
?r=f(x.replace(/./g,c=>"01!&|^()".indexOf(c)))
0|!0
bekerja, tetapi sekarang saya lakukan, dapatkan upvote saya.Retina, 49 byte
Saya tidak tahu bagaimana hasilnya begitu singkat.
Pemetaan karakter:
1
,,0
dan!
dibiarkan tidak berubah.Ini bekerja dengan mengganti semua ekspresi truthy (tunggal
1
dalam kurung,!0
,1&1
,1^0
,0|1
, dll) dengan1
, dan semua lainnya (tunggal0
dalam kurung,!1
,1&0
,1^1
,0|0
, dll) dengan0
.Cobalah online!
Cobalah online dengan pemetaan karakter otomatis!
sumber
grep + shell utils, 131 byte
Karakter berikut diubah namanya:
Saya mulai mencoba untuk menulis solusi grep, tetapi menemukan bahwa itu tidak bekerja dengan baik dengan operator infiks asosiatif kiri. Saya perlu memiliki pola seperti (rantai operator) = (rantai operator) (ops biner) (operan tunggal), tetapi ini berisi kemungkinan rekursi tak terbatas, jadi grep menolak untuk menjalankannya. Tetapi saya perhatikan bahwa saya dapat mengurai operator asosiasi kanan. Ini membuat
!
operator sakit, tetapi itu masih mungkin. Jadi saya membuat regex untuk menghitung ekspresi boolean mundur, dan mengirim inputrev
. Regex itu sendiri, yang cocok dengan ekspresi sebenarnya, adalah 116 byte.TODO: pilih karakter yang berbeda untuk input sehingga saya bisa membedakan semua grup operator yang digunakan dengan kelas karakter bawaan.
sumber
(?9)
artinya\9
yang berarti mencocokkan dengan apa kelompok penangkap ke-9 cocok). Jadi misalnya(\d)\1
cocok dengan digit yang sama dua kali, sedangkan(\d)(\?1)
cocok dengan dua digit.Python, 210 byte
Keturunan rekursif yang sangat buruk, saya berharap ini akan dikalahkan dalam sekejap.
sumber
Mathematica,
139129 byteSolusi penggantian string sederhana jauh lebih baik daripada yang saya harapkan.
sumber
JavaScript ES6, 223 byte
Menggunakan algoritma halaman shunting.
Penggunaan
+
untuk OR,!
untuk negasi,^
untuk XOR, dan&
untuk dan.0
dan1
digunakan untuk nilai masing-masing. Tentu, saya bisa bermain golf beberapa dengan membuat angka operator, tapi saya tidak memenangkan hadiah JavaScript bahkan jika saya melakukannya, jadi saya pikir saya akan membuatnya setidaknya terbaca dan benar.sumber
C, 247
Golf:
Tidak digabung, dengan
main()
(mengambil ekspresi sebagai argumen 1). Versi golf tidak memiliki debugging printfs dan menggunakan kode ascii 2-digit sebagai ganti char literals (40 == '('
). Aku bisa menyelamatkan beberapa karakter dengan pemetaan()|^&!
untuk234567
- ini akan membuat banyak manipulasi dan tes lebih mudah setelah dikurangi48
dari masing-masing.sumber
for(j=i=1;i+=s[++j]==')'?-1:s[j]=='('?1:0,i;);
.Java, 459 byte
AND
adalah&
OR
isl
(huruf kecil L)XOR
adalahx
(atau karakter lain yang kebetulan bermain bagus denganString
metode sepertiString.replaceAll(...)
)NOT
adalah!
(
adalaha
)
adalahb
inilah versi yang lebih mudah dibaca:
coba online
sumber
Jawa, 218
Menggunakan pencocokan pola, tetapi menghindari penggantian out-of-order dari upaya Java saya yang gagal sebelumnya (mata tajam di sana, @Kenny Lau !).
Golf:
Tidak digabungkan, membaca masukan dari argumen dan menerapkan pemetaan
oaxn
untuk|&^!
dan<>
untuk()
:Java
m.group(i)
memberi tahu Anda grup mana yang cocok; kelompok 1 adalah untuk penggantian yang benar dan yang kedua untuk yang salah. Ini diulang dalam urutan kiri-ke-kanan yang ketat sampai tidak ada pergantian yang dilakukan.sumber