Misi Anda, jika Anda memilih untuk menerimanya, adalah untuk membangun evaluator kebenaran sederhana untuk operator logis berikut:
----------------------------------------------------------------------------------
Logical Name | Gate Name | Symbol | Symbol Name | Truth Table
----------------------------------------------------------------------------------
Identity | is | | (none) | 10
Negation | not | ~ | tilde | 01
Conjunction | and | & | ampersand | 1000
Disjunction | or | | | pipe | 1110
Negative Conjunction | nand | ^ | caret | 0111
Joint Denial | nor | v | "vee" | 0001
Exclusive Disjunction | xor | x | "ecks" | 0110
Equivalence | equals/xnor | = | equals | 1001
Implication | implies | > | greater than | 1011
Tabel kebenaran berada dalam urutan sebagai berikut:
- 1 1
- 1 0
- 0 1
- 0 0
Input akan muncul sebagai string sederhana 0, 1, dan simbol. Anda dapat menerima input sebagai parameter atau membacanya dari pengguna di stdin. Berikut adalah beberapa pasangan input / output sampel:
Input: 1
Output: 1
Input: ~1
Output: 0
Input: 0|1
Output: 1
Input: 1>0
Output: 0
Operator unary (negasi) akan selalu muncul sebelum nilai boolean, sedangkan operator biner akan selalu muncul di antara dua nilai boolean. Anda dapat mengasumsikan bahwa semua input akan valid. String adalah string ASCII biasa.
Jika Anda suka, Anda dapat menggunakan T dan F daripada 1 dan 0. -6 untuk jumlah karakter Anda jika Anda mendukung keduanya.
Ini adalah kode-golf : kode terpendek dalam bahasa apa pun menang!
sumber
^
nama simbol harus diucapkan caret .Jawaban:
APL (45 - 6 = 39)
Mendukung
T
danF
sebagai input tetapi akan selalu menampilkan0
atau1
.Penjelasan:
Z←⍞
: baca baris dan simpan diZ
L←'TF&|^vx>'⍳Z
: Mendapatkan indeks di'TF&|^vx>'
untuk setiap karakter dalamZ
, memberikan9
jika karakter tidak di'TF&|^vx>'
.'10∧∨⍲⍱≠≤*'[
...]
: cari karakter yang sesuai di'10∧∨⍲⍱≠≤*'
. (Jadi karakter yang tidak ada dalam daftar pertama menjadi*
).↓⍉Z⍪⍉⍪
: buat ini menjadi sebuah matriks, letakkan yang asli (Z
) di atasnya, dan pisahkan menjadi daftar string, di mana karakter pertama adalah asli dan karakter kedua adalah terjemahannya, jika ada.(1+9≠L)⌷¨
: untuk setiap string ini, dapatkan karakter pertama jika tidak ada terjemahan (jikaL=9
di tempat itu) dan karakter kedua jika ada.T|0
, kita akan memiliki1∨0
sekarang yang merupakan ekspresi APL yang sesuai⍎
: evalCatatan:
~
dan=
sudah melakukan hal yang benar sehingga mereka tidak perlu diganti oleh apa pun.sumber
⍎'1010~∧∨⍲⍱≠=≤'['10TF~&|^vx=>'⍳⍞]
? (Nilai 33-6 = 27)C -
165127Itu tadi menyenangkan! Tabel pencarian biasa mengandalkan offset tetap untuk pencarian.
Untuk beberapa alasan
gets
tidak mendapatkan secara implisit menyatakan, jadi ketika saya dihapus termasuk saya harus mengubahgets(t+2)
ke(gets(t+2),t)
(atau sama di tempat lain, biaya sebanyak).Penjelasan
Pertama-tama, karena tabel kebenaran untuk operator memiliki banyak karakter yang tumpang tindih, kami ingin menyimpan tabel pencarian dengan cara sehingga kami memungkinkan tumpang tindih. Inilah cara saya memilih untuk menyimpannya:
Selanjutnya, kami ingin memetakan simbol operator ke offset ini. Kami melakukan ini dengan menyimpan simbol operator dalam string yang sama pada offset tetap dari data LUT (yaitu, 16 karakter kemudian, yaitu langsung setelah data LUT). Proses pencarian adalah "cari operator
s
, kurangi16
, tambahkanleft*2+right
(operan kiri / kanan). Untuk pencarian" operasi identitas "kosong, karena cara input diambil operator dalam hal ini akan menyelesaikan apa punt[1]
yang diinisialisasi untuk- -dalam kasus kami/
. jadi, kami menggunakan/
sebagai kunci tabel untuk mewakili operasi identitas. Ketika kita memproses unary~
operasi "left
" (untuk perhitungan lookup disebutkan sebelumnya) selalu yang sama/
./
terjadi menjadi salah satu kurang dari0
ASCII-wise, artinya ketika kita mengkompensasi digit ASCII\
akan mewakili-1
. Garis miring di area kunci tabel pencarian (karakter kedua hingga terakhirs
, yaitu) diposisikan untuk mengimbangi ini.Selanjutnya, penanganan input. Input memiliki panjang dinamis, tetapi akan lebih mudah jika kita memiliki nama statis spesifik untuk operan kiri, operator dan operan kanan, terlepas dari input. Jika kita berpura-pura bahwa kita dapat membaca input dari kanan ke kiri, ini pada dasarnya akan terjadi secara otomatis - operan kanan selalu merupakan karakter paling kanan, operator (jika ada) adalah kedua-ke-paling kanan, operan kiri (jika ada ) adalah dari ketiga ke kanan. Untuk dapat mengindeks string seperti ini, kami menggunakan
strchr
untuk menemukan\0
terminator (- 3
untuk mempermudah pengindeksan). Ini menunjukkan mengapat[0]
dant[1]
menjadi operan / operator kiri masing-masing ketika inputnya 1 atau 2 karakter.Menyatukannya, hasilnya akan menjadi
putchar(strchr(s,u[1])[(u[0] - '0')*2 + (u[2] - '0') - 15])
, tetapi beberapa refactoring dan lipat konstan malah membuat kita lebih pendekputchar(strchr(s,u[1])[u[0]*2+u[2]-159])
.sumber
Tcl,
212208-6 = 202Tidak Disatukan:
Saya pikir garis depan perlu penjelasan:
split $argv {}
memisahkan string input (sebenarnya adalah daftar, tetapi kode-golf) menjadi karakter itu.string map {{~ 0} 1 {~ 1} 0} ...
mengambil string dan menggantikan~ 0
dengan1
dan~ 1
dengan0
lassign ... a
mengambil elemen pertama dari daftar dan menugaskannya ke variabel a, mengembalikan sisanya.foreach {op b} ... {code}
berjalan di atas daftar dan mengambil 2 elemen setiap kali:op
danb
set a [$op $a $b]
mengeksekusi perintah dalam variabelop
, menyimpan hasilnya dalama
sumber
JavaScript -
107105 karaktersumber
eval()
ketika saya mengada-ada. Beri aku sedikit untuk pulang dan mengujinya.&~
dan juga =|~
?&~
- benar dan|~
, tetapi NAND hanyalah kebalikan dari AND. Jadi, inversing salah satu bit tidak membalikkan hasilnya juga.Befunge-98 -
104 101 98-672... karena setiap tugas membutuhkan solusi esolang .. terjemahan implementasi C saya, tetapi memproses karakter satu per satu.
Fakta yang menyenangkan: gantiREPL tidak ada lagi.@
toa,$
dan Anda akan mendapatkan REPL yang tidak pernah berakhir (meskipun, jika Anda melakukan ini, Anda akan melihat bahwa identitas sebenarnya "ulangi perintah terakhir dengan lhs = 0 dan rhs = input", yang kebetulan merupakan default untuk identitas ).Tidak digabungkan (versi sebelumnya):
Sunting: terinspirasi oleh solusi @jpjacobs, saya sekarang mengandalkan posisi karakter dalam LUT untuk mewakili tabel kebenaran. Misalnya,
|
ada di posisi 1110 2 = 14 karena ini sesuai dengan tabel kebenaran untuk|
.sumber
J -
6567-6 = 61Tidak ada lagi b. Kata keterangan. Tanpa menghitung penugasan fungsi: 67 karakter untuk versi TF, 63 untuk versi non-TF:
LgcTF menangani 0 dan 1 serta T dan F.
Mendukung semua sintaks J dalam hal kereta, tanda kurung, dan mengevaluasi secara ketat dari kanan ke kiri (tidak ada aturan prioritas lainnya).
Semua karakter yang tidak ada dalam daftar operator + Z tidak dapat digunakan, yang lain akan bertindak seperti dalam standar J (termasuk variabel).
Pemakaian:
sumber
Catatan tambahan 263
Gagasan Firefly diterjemahkan ke dalam Postscript.
Bertakuk:
sumber
Befunge-93, 86 karakter
Bekerja dengan hashing simbol kedua input (menemukan fungsi yang kompak dan menghindari tabrakan adalah beberapa pekerjaan) untuk koordinat, dan mengambil simbol pertama dan ketiga masing-masing modulo 2 sebagai dua bit paling signifikan dari koordinat x, maka mengambil nilai apa pun pada posisi yang ditunjukkan. Fungsi hash yang lebih baik atau metode penyimpanan / pengalamatan tabel kebenaran yang lebih ringkas hanyalah dua cara yang bisa dilakukan untuk mengurangi panjangnya.
sumber