var QUESTION_ID=82938,OVERRIDE_USER=48934;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+(?:\.\d+)?)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
Jawaban:
Domino , 122.000 byte atau 72 ubin
Jumlah byte adalah ukuran file yang disimpan
0.122 MB
.Komputasi domino adalah inspirasi. Saya telah menguji semua ini hingga simetri (dan seterusnya!) Melalui game Steam virtual-reality yang disebut Tabletop Simulator .
Detail
True
atau1False
atau0100%
Gates
644343151132171376761615TL; DR
Saya telah menunggu / menginginkan tantangan ramah-domino dan ketika saya melihat ini, saya tidak bisa melewatkannya. Satu-satunya masalah adalah bahwa ternyata tidak ada yang memiliki kartu domino lagi! Jadi akhirnya saya menyerah dan membeli Double Twelve . Set ini memiliki 91 ubin, yang memberi saya ide untuk memiliki 'panggilan fungsi' / mulai domino daripada metode 'waktu tunda' yang normal (lama). Kredit untuk pergantian 90 derajat adalah milik saluran dominoesdouble07 .
Setelah membangun ini dengan domino fisik, diputuskan pada meta bahwa solusi yang valid harus digital. Jadi saya menciptakan kembali gerbang ini di Simulator Meja . Sayangnya, TS dan kenyataan tidak setuju dengan fisika domino. Ini mengharuskan saya menambahkan 11 kartu domino tetapi saya juga menyelamatkan 8. Secara keseluruhan, kartu domino virtual sekitar x150 lebih efektif dalam hal membangun dan menguji ( Ctrl+ Z).
Memperbarui
xor xnor nand
xnor
danxor
xor
danxnor
). Memblokir di Tabletop hanya membutuhkan 1 domino, bukan 2.sumber
Hexagony , 89 byte
Terima kasih kepada FryAmTheEggman untuk beberapa inspirasi yang diperlukan untuk solusi XOR.
Semua program menggunakan
0
false dan1
true.Cobalah online! Ini bukan test suite, Anda harus menyalin di berbagai program dan memasukkan sendiri.
Solusi di atas adalah dalam 2-byte optimalitas (kecuali kita mengendurkan interpretasi yang benar / salah, saya kira). Aku telah membiarkan sebuah kasar pencarian kekuatan kabur dekat dengan dua hari atas semua program yang masuk ke dalam sisi-panjang 2, yaitu hingga 7 byte (tidak cukup semua program - Saya membuat beberapa asumsi tentang apa yang setiap kebutuhan program yang valid dan apa yang tidak ada program yang valid dapat memiliki). Pencarian menemukan solusi untuk 15 dari 16 kemungkinan gerbang - dan seringkali lebih dari satu. Anda dapat menemukan daftar semua solusi alternatif di pastebin ini di mana saya juga mengelompokkannya berdasarkan perilaku yang setara. Yang saya tunjukkan di atas saya pilih karena mereka adalah solusi paling sederhana atau paling menarik, dan saya akan menambahkan penjelasan untuk mereka besok.
Adapun gerbang ke-16: XOR adalah satu-satunya gerbang yang tampaknya tidak dapat diimplementasikan dalam 7 byte. Pencarian brute force melalui program yang lebih besar sayangnya tidak layak dengan kode yang saya miliki saat ini. Jadi XOR harus ditulis dengan tangan. Yang terpendek yang saya temukan sejauh ini adalah program 10-byte di atas, yang didasarkan pada upaya gagal (tapi sangat dekat) oleh FryAmTheEggman. Ada kemungkinan bahwa solusi 8-byte atau 9-byte ada, tetapi selain itu, semua solusi memang harus optimal.
Penjelasan
Peringatan: dinding teks. Jika ada yang tertarik bagaimana program Hexagony yang sangat padat ini benar-benar bekerja, saya telah menyertakan penjelasan untuk masing-masingnya di bawah ini. Saya telah mencoba untuk memilih solusi paling sederhana untuk setiap gerbang dalam kasus di mana ada lebih dari satu program optimal, agar penjelasannya cukup singkat. Namun, beberapa dari mereka masih merusakkan pikiran, jadi saya pikir mereka pantas mendapatkan penjelasan lebih lanjut.
0000
: SalahSaya tidak berpikir kita akan membutuhkan diagram untuk yang ini:
Karena seluruh kotak memori diinisialisasi ke nol,
!
cukup cetak nol dan@
akhiri program.Ini juga satu-satunya solusi 2-byte.
0001
: DanIni pada dasarnya menerapkan hubungan arus pendek . Diagram abu-abu di bawah ini menunjukkan awal program, di mana input pertama dibaca dengan
?
dan penunjuk instruksi (IP) membungkus ke sudut kiri di mana|
cermin memantulkannya. Sekarang sudut bertindak sebagai kondisional, seperti ada dua jalur eksekusi yang berbeda tergantung pada nilai input pertama. Diagram merah menunjukkan aliran kontrol untukA = 0
dan diagram hijau untukA = 1
:Seperti yang Anda lihat, ketika
A
ada0
, maka kita cukup mencetaknya dan mengakhiri (ingat bahwa semua.
adalah tanpa operasi). Tapi ketikaA
adalah1
, maka IP melintasi baris pertama lagi, membacaB
dan pencetakan yang sebaliknya.Total ada enam belas solusi 5-byte untuk gerbang ini. Empat belas dari mereka pada dasarnya sama dengan yang di atas, baik menggunakan
>
alih-alih|
atau mengganti.
dengan perintah yang secara efektif no-op, atau menempatkan?
di posisi kedua:Dan kemudian ada dua solusi lain (yang setara satu sama lain). Ini juga menerapkan logika hubungan pendek yang sama, tetapi jalur eksekusi agak lebih gila (dan dibiarkan sebagai latihan bagi pembaca):
0010
: A dan bukan BIni juga mengimplementasikan bentuk hubungan arus pendek, tetapi karena penggunaan
#
aliran kontrol jauh lebih sulit.#
adalah saklar IP bersyarat. Hexagony sebenarnya berasal dengan enam IP berlabel0
untuk5
, yang dimulai pada enam sudut grid, menunjuk sepanjang tepi searah jarum jam mereka (dan program selalu dimulai dengan IP0
). Ketika a#
ditemui, nilai saat ini diambil modulo6
, dan aliran kontrol berlanjut dengan IP yang sesuai. Saya tidak yakin apa yang cocok dengan kegilaan membuat saya menambahkan fitur ini, tetapi tentu saja memungkinkan untuk beberapa program mengejutkan (seperti ini).Kami akan membedakan tiga kasus. Kapan
A = 0
, program ini cukup sederhana, karena nilainya selalu0
ketika#
ditemui sehingga tidak ada IP-switching yang terjadi:#
tidak melakukan apa-apa,?
membacaA
(yaitu juga tidak melakukan apa-apa),#
masih tidak melakukan apa-apa,!
mencetak0
,)
menambahnya (ini penting, jika IP tidak akan melompat ke baris ketiga),@
mengakhiri program. Cukup sederhana. Sekarang mari kita perhatikan kasusnya(A, B) = (1, 0)
:Jalur merah masih sesuai dengan IP
0
, dan saya telah menambahkan jalur hijau untuk IP1
. Kami melihat bahwa setelah?
membacaA
(1
kali ini),#
beralih ke IP yang dimulai di sudut kanan atas. Itu artinya?
bisa membacaB
(0
). Sekarang)
menambahkan itu ke1
, sehingga#
di sudut kiri atas tidak melakukan apa-apa dan kami tetap dengan IP1
. The!
cetakan yang1
dan IP membungkus di sekitar diagonal kiri.#
masih tidak melakukan apa-apa dan@
menghentikan program.Akhirnya, kasus yang sangat aneh di mana kedua input adalah
1
:Kali ini, input kedua juga
1
dan)
menambahnya2
. Itu berarti#
di sudut kiri atas menyebabkan lain beralih IP ke IP2
, menunjukkan warna biru. Di jalur itu, pertama-tama kita menambahnya lebih jauh3
(meskipun itu tidak relevan) dan kemudian melewati yang?
ketiga kalinya. Karena kita sekarang telah menekan EOF (yaitu input habis),?
mengembalikan0
,!
mencetak itu, dan@
mengakhiri program.Khususnya, ini adalah satu-satunya solusi 6-byte untuk gerbang ini.
0011
: SEBUAHIni cukup sederhana sehingga kita tidak memerlukan diagram:
?
membacaA
,!
mencetak,@
mengakhiri.Ini adalah satu-satunya solusi 3-byte untuk gerbang ini. (Pada prinsipnya, itu juga mungkin dilakukan
,;@
, tetapi pencarian tidak termasuk;
, karena saya tidak berpikir itu bisa menghemat byte!
untuk tugas ini.)0100
: B dan bukan AYang ini jauh lebih sederhana daripada "saudara" nya
0010
. Aliran kontrol sebenarnya sama seperti yang telah kita lihat di atas untuk0001
(Dan). JikaA = 0
, maka IP akan melintasi garis bawah, membacaB
dan mencetaknya sebelum mengakhiri. JikaA = 1
kemudian IP melintasi baris pertama lagi, juga membacaB
, tetapi+
menambahkan dua tepi memori yang tidak digunakan sehingga semua yang dilakukannya adalah mereset nilai saat ini0
, sehingga!
selalu dicetak0
.Ada cukup banyak alternatif 6-byte untuk ini (totalnya 42). Pertama, ada satu ton solusi yang setara dengan yang di atas. Kita dapat kembali memilih antara
|
dan>
, dan+
dapat diganti dengan perintah lain yang memberi kita keunggulan kosong:Selain itu, kita juga bisa menggunakan
]
bukan?
.]
pindah ke IP berikutnya (yaitu memilih IP1
), sehingga cabang ini malah menggunakan kembali?
di sudut kanan atas. Itu memberi 18 solusi lain:Dan kemudian ada enam solusi lain yang semuanya bekerja secara berbeda dengan berbagai tingkat kegilaan:
0101
: BWoohoo, satu lagi yang sederhana: baca
A
, bacaB
, cetakB
, hentikan. Sebenarnya ada alternatif untuk ini. KarenaA
hanya satu karakter, kita juga dapat membacanya dengan,
:Dan ada juga opsi untuk menggunakan satu
?
dan menggunakan cermin untuk menjalankannya dua kali:0110
: XorSeperti yang saya katakan di atas, ini adalah satu-satunya gerbang yang tidak akan cocok dengan sisi panjang 2, jadi ini solusi tulisan tangan oleh FryAmTheEggman dan saya sendiri, dan ada peluang bagus bahwa itu tidak optimal. Ada dua kasus untuk dibedakan. Jika
A = 0
aliran kontrolnya cukup sederhana (karena dalam hal ini kita hanya perlu mencetakB
):Kami mulai di jalur merah.
?
berbunyiA
,<
adalah cabang yang membelokkan nol kiri. IP membungkus ke bawah, lalu_
cermin lain, dan ketika IP menyentuh sudut, itu membungkus ke sudut kiri atas dan berlanjut di jalur biru.?
membacaB
,!
mencetaknya. Sekarang(
dekrementasi. Ini penting karena memastikan nilainya tidak positif (baik sekarang0
atau-1
sekarang). Itu membuat IP wrap ke sudut kanan, tempat@
mengakhiri program.Ketika
A = 1
segalanya menjadi sedikit rumit. Dalam hal ini kami ingin mencetaknot B
, yang dengan sendirinya tidak terlalu sulit, tetapi jalur eksekusi agak trippy.Kali ini,
<
IP membelokkan ke kanan dan selanjutnya<
hanya bertindak sebagai cermin. Jadi IP melewati jalur yang sama secara terbalik, membacaB
ketika bertemu?
lagi. IP membungkus ke sudut kanan dan melanjutkan di jalur hijau. Ini pertemuan berikutnya(~
yang "penurunan, kalikan dengan -1", yang swap0
dan1
dan karena itu menghitungnot B
.\
hanyalah sebuah cermin dan!
mencetak hasil yang diinginkan. Kemudian?
cobalah untuk mengembalikan nomor lain tetapi mengembalikan nol. IP sekarang berlanjut di sudut kiri bawah di jalur biru.(
decrements,<
mencerminkan,(
menurun lagi, sehingga nilai saat ini negatif ketika IP menyentuh sudut. Bergerak melintasi diagonal kanan bawah dan akhirnya hits@
untuk menghentikan program.0111
: AtauLebih banyak korsleting.
The
A = 0
kasus (jalur merah) adalah sedikit membingungkan di sini. IP dibelokkan ke kiri, membungkus ke sudut kiri bawah, langsung tercermin oleh<
dan kembali?
ke membacaB
. Kemudian membungkus ke sudut rigt, mencetakB
dengan!
dan berakhir.The
A = 1
kasus (jalur hijau) adalah sedikit lebih sederhana. The<
cabang mengalihkan IP yang tepat, jadi kami hanya mencetak!
, membungkus kembali ke kiri atas, dan berakhir pada@
.Hanya ada satu solusi 5-byte lainnya:
Ini bekerja pada dasarnya sama, tetapi jalur eksekusi yang sebenarnya sangat berbeda dan menggunakan sudut untuk percabangan bukannya a
<
.1000
: JugaIni mungkin program favorit saya yang ditemukan dalam pencarian ini. Yang paling keren adalah implementasi ini
nor
benar - benar berfungsi hingga 5 input. Saya harus masuk ke detail model memori sedikit untuk menjelaskan yang ini. Jadi sebagai penyegaran cepat, model memori Hexagony adalah kisi heksagonal terpisah, di mana setiap sisi memegang nilai integer (awalnya semuanya nol). Ada penunjuk memori (MP) yang menunjukkan tepi dan arah sepanjang tepi itu (sedemikian rupa sehingga ada dua tepi tetangga di depan dan di belakang tepi saat ini, dengan tetangga kiri dan kanan yang berarti). Berikut adalah diagram tepi yang akan kami gunakan, dengan MP dimulai seperti yang ditunjukkan dengan warna merah:Pertama mari kita perhatikan kasus di mana kedua input berada
0
:Kita mulai di jalur abu-abu, yang hanya menambah tepi A ke
1
sehingga#
beralih ke IP1
yang merupakan jalur biru, mulai dari sudut kanan atas.\
tidak melakukan apa pun di sana dan?
membaca input. Kami membungkus ke sudut kiri atas tempat)
penambahan input itu. Sekarang selama inputnya nol, ini akan menghasilkan a1
, sehingga#
tidak melakukan apa-apa. Kemudian{
bergerak MP ke kiri, yaitu pada iterasi pertama dari A ke B . Karena tepi ini masih memiliki nol awal IP membungkus kembali ke sudut kanan atas dan di tepi memori baru. Jadi loop ini akan terus berlanjut selama?
membaca nol, menggerakkan MP di sekitar segi enam dari Bke C ke D dan seterusnya. Tidak masalah apakah?
mengembalikan nol karena input atau karena EOF.Setelah enam iterasi melalui loop ini,
{
kembali ke A . Kali ini, ujung sudah memegang nilai1
dari iterasi pertama, sehingga IP membungkus ke sudut kiri dan melanjutkan pada jalur hijau sebagai gantinya.!
hanya mencetak itu1
dan@
menghentikan program.Sekarang bagaimana jika ada input
1
?Kemudian
?
bacalah itu1
di beberapa titik dan)
tambahkan ke2
. Itu berarti#
sekarang akan beralih IP lagi dan kami akan melanjutkan di sudut kanan di jalur merah.?
membaca input lain (jika ada), yang tidak terlalu penting dan{
bergerak lebih jauh. Ini harus menjadi tepi yang tidak digunakan, oleh karena itu ini berfungsi hingga 5 input. IP membungkus ke kanan atas di mana itu segera tercermin dan membungkus ke sudut kiri.!
mencetak0
pada tepi yang tidak digunakan dan#
beralih kembali ke IP0
. IP itu masih menunggu di sekitar#
, menuju barat daya (jalur abu-abu), sehingga segera menyentuh@
dan mengakhiri program.Secara total ada tujuh solusi 7-byte untuk gerbang ini. 5 dari mereka bekerja sama seperti ini dan hanya menggunakan perintah lain untuk pindah ke tepi yang tidak digunakan (dan dapat berjalan di sekitar segi enam yang berbeda atau ke arah yang berbeda):
Dan ada satu kelas solusi lain yang hanya bekerja dengan dua input, tetapi jalur eksekusi yang sebenarnya lebih berantakan:
1001
: KesetaraanIni juga sangat cerdas dalam menggunakan pemilihan IP bersyarat. Kita perlu membedakan lagi antara
A = 0
danA = 1
. Dalam kasus pertama kita ingin mencetaknot B
, dalam kasus kedua kita ingin mencetakB
. KarenaA = 0
kami juga membedakan dua kasus untukB
. Mari kita mulai denganA = B = 0
:Kami mulai di jalur abu-abu.
(~
dapat diabaikan, IP membungkus ke sudut kiri (masih di jalur abu-abu) dan membacaA
dengan?
.(
decrements itu, jadi kita dapatkan-1
dan bungkus IP ke sudut kiri bawah. Sekarang seperti yang saya katakan sebelumnya,#
ambil modulo nilai6
sebelum memilih dia IP, jadi nilai-1
IP benar-benar keluar5
, yang dimulai di sudut kiri di jalur merah.?
berbunyiB
,(
mengurangi itu juga sehingga kita tetap di IP5
ketika kita menekan#
lagi.~
meniadakan-1
sehingga IP membungkus ke sudut kanan bawah, mencetak1
dan berakhir.Sekarang jika
B
adalah1
sebaliknya, nilai saat akan0
ketika kita memukul#
kedua kalinya, jadi kami beralih kembali ke IP0
(sekarang jalan hijau). Itu memukul?
untuk ketiga kalinya, menghasilkan0
,!
mencetaknya, dan@
berakhir.Akhirnya, kasusnya dimana
A = 1
. Kali ini nilai saat ini sudah nol ketika kami menekan#
untuk pertama kalinya, jadi ini tidak pernah beralih ke IP5
di tempat pertama. Kami hanya melanjutkan langsung di jalur hijau.?
sekarang tidak hanya memberikan nol tetapiB
malah mengembalikannya .!
mencetaknya dan@
berakhir lagi.Total ada tiga solusi 7-byte untuk gerbang ini. Dua lainnya bekerja sangat berbeda (bahkan dari satu sama lain), dan membuat penggunaan lebih aneh
#
. Secara khusus mereka membaca satu atau lebih nilai dengan,
(membaca kode karakter alih-alih bilangan bulat) dan kemudian menggunakan nilai itu modulo 6 untuk memilih IP. Ini sangat gila.1010
: Tidak bYang ini cukup sederhana. Jalur eksekusi adalah cabang horizontal yang sudah kita ketahui
and
sebelumnya.??
membacaA
dan kemudian segeraB
. Setelah merefleksikan|
dan bercabang, karenaB = 0
kita akan mengeksekusi cabang bawah, di mana)
menambah nilai1
yang kemudian dicetak oleh!
. Di cabang atas (jikaB = 1
)?
cukup mengatur ulang tepi0
yang kemudian dicetak oleh!
.Ada delapan program 6-byte untuk gerbang ini. Empat dari mereka hampir sama, menggunakan
>
bukan|
atau1
bukan)
(atau keduanya):Dua menggunakan satu
?
yang digunakan dua kali karena cermin. Negasi kemudian terjadi seperti yang kita lakukanxor
dengan(~
atau~)
.Dan akhirnya, dua solusi menggunakan saklar IP bersyarat, karena mengapa menggunakan cara sederhana jika yang berbelit-belit juga berfungsi:
1011
: B menyiratkan AIni menggunakan beberapa IP switching yang agak rumit. Saya akan mulai dengan
A = 1
kasing kali ini, karena lebih sederhana:Kita mulai pada jalur abu-abu, yang berbunyi
A
dengan?
dan kemudian klik#
. SejakA
adalah1
ini beralih ke IP1
(jalur hijau). The!
segera mencetak itu, IP membungkus ke kiri atas, membacaB
(tidak perlu) dan berakhir.Ketika
A = 0
segalanya menjadi sedikit lebih menarik. Pertama mari kita pertimbangkanA = B = 0
:Kali ini,
#
tidak melakukan apa-apa dan kami tetap di IP0
(jalur merah sejak saat itu dan seterusnya).?
membacaB
dan1
mengubahnya menjadi1
. Setelah membungkus ke sudut kiri atas, kami menekan#
lagi, jadi kami berakhir di jalur hijau, dan mencetak1
seperti sebelumnya, sebelum mengakhiri.Akhirnya, inilah
(A, B) = (0, 1)
yang salah:Perhatikan bahwa saya telah menghapus jalur abu-abu awal untuk kejelasan, tetapi program dimulai dengan cara yang sama, dan kita berakhir di jalur merah seperti sebelumnya. Jadi kali ini yang kedua
?
kembali1
. Sekarang kita temui1
. Pada titik ini, penting untuk memahami apa yang sebenarnya dilakukan digit dalam Hexagony (sejauh ini kami hanya menggunakannya pada nol): ketika digit dijumpai, nilai saat ini dikalikan dengan 10 dan kemudian digit ditambahkan. Ini biasanya digunakan untuk menulis angka desimal kata demi kata ke dalam kode sumber, tetapi itu berarti bahwaB = 1
sebenarnya dipetakan ke nilai11
. Jadi ketika kita menekan#
, ini diambil modulo6
untuk diberikan5
dan karenanya kita beralih ke IP5
(bukan1
seperti sebelumnya) dan melanjutkan di jalur biru. Memukul?
ketiga kalinya mengembalikan nol, sehingga!
mencetak itu, dan setelah dua yang lain?
, IP membungkus ke kanan bawah di mana program berakhir.Ada empat solusi 7-byte untuk ini dan mereka semua bekerja secara berbeda:
1100
: Tidak aHanya yang linier sederhana: baca
A
dengan?
, negasikan dengan(~
, cetak dengan!
, akhiri dengan@
.Ada satu solusi alternatif, dan itu meniadakan dengan
~)
:1101
: A menyiratkan BIni jauh lebih sederhana daripada implikasi sebaliknya yang baru saja kita bicarakan. Lagi-lagi ini adalah salah satu program cabang horizontal, seperti untuk
and
. JikaA
adalah0
, itu hanya akan bertambah untuk1
di cabang bawah dan dicetak. Kalau tidak, cabang teratas dieksekusi lagi di mana?
membacaB
dan kemudian!
mencetaknya.Ada banyak alternatif di sini (total 66 solusi), sebagian besar karena pilihan bebas dari no-op yang efektif. Sebagai permulaan kami dapat memvariasikan solusi di atas dengan semua cara yang sama yang kami bisa lakukan
and
dan kami juga dapat memilih antara)
dan1
:Dan kemudian ada versi yang berbeda menggunakan pemilihan IP bersyarat, di mana perintah pertama dapat dipilih hampir secara sewenang-wenang, dan ada juga pilihan antara
)
dan1
untuk beberapa opsi tersebut:1110
: NandYang rumit terakhir. Jika Anda masih membaca, Anda hampir berhasil. :) Mari kita lihat
A = 0
dulu:?
membacaA
dan kemudian kami menekan$
. Ini adalah perintah lompatan (seperti perintah Befunge#
) yang melompati instruksi selanjutnya sehingga kita tidak mengakhiri@
. Sebaliknya IP berlanjut di#
. Namun sejakA
itu0
, ini tidak melakukan apa-apa.)
menambahnya1
sehingga IP melanjutkan di jalur bawah di mana1
dicetak. The<
mengalihkan IP ke kanan di mana ia membungkus ke sudut kiri dan program berakhir.Selanjutnya, ketika inputnya
(A, B) = (1, 0)
kita dapatkan situasi ini:Ini pada dasarnya sama seperti sebelumnya, kecuali bahwa pada
#
kita beralih ke IP1
(jalur hijau), tapi karenaB
ini0
kita beralih kembali ke IP0
ketika kita memukul#
kedua kalinya (jalan sekarang biru), di mana ia mencetak1
seperti sebelumnya.Akhirnya,
A = B = 1
kasusnya:Kali ini, saat kami
#
kedua kalinya, nilai saat ini masih1
sehingga kami tidak mengubah IP lagi. Yang<
memantulkannya dan ketiga kalinya kami menekan?
kami mendapat nol. Oleh karena itu IP membungkus ke kiri bawah di mana!
mencetak nol dan program berakhir.Ada sembilan solusi 7-byte total untuk ini. Alternatif pertama hanya menggunakan
1
bukannya)
:Lalu ada dua solusi yang akan membantu Anda dengan jumlah IP switching yang terjadi:
Ini benar-benar mengejutkan saya: bagian yang menarik adalah bahwa IP switching dapat digunakan sebagai persyaratan yang ditangguhkan. Aturan IP-switching bahasa adalah sedemikian rupa sehingga IP saat ini membuat langkah lain sebelum beralih terjadi. Jika langkah itu terjadi melalui sudut, maka nilai saat ini memutuskan cabang IP yang akan dilanjutkan jika kita pernah beralih kembali ke sana. Persisnya ini terjadi ketika input
A = B = 1
. Meskipun ini semua konsisten dengan bagaimana saya mendesain bahasa, saya tidak pernah menyadari implikasi dari spesifikasi ini, jadi bagus ketika bahasa saya mengajarkan saya beberapa trik baru: D.Lalu ada solusi ketiga yang jumlah IP switching-nya bahkan lebih buruk (walaupun tidak menggunakan efek kondisional yang ditunda):
Dan kemudian ada satu lagi:
Dan kemudian ada empat solusi setara ini, yang memang menggunakan beberapa IP switching non-kondisional dan sebaliknya menerapkan semua logika melalui cabang dan sudut:
1111
: BenarAnda telah mendapatkan sendiri sesuatu yang sederhana untuk akhir: mengatur untuk
1
, mencetak dengan!
, mengakhiri dengan@
. :)Tentu saja, ada satu alternatif:
Seperti biasa, semua diagram alir kontrol dibuat dengan HexagonyColorer Timwi dan diagram memori dengan EsotericIDE- nya .
sumber
APL,
222018 byteEntri benar dan salah adalah program yang lengkap, dan 14 lainnya adalah fungsi. (Terima kasih kepada Adám.)
Coba di sini.
sumber
0
dan1
.Pemain catur / catur biasa-biasa saja di endgame, 70 buah
Terinspirasi oleh jawaban domino itu, saya memutuskan game lain harus mendapat kehormatan ini.
Perhatikan bahwa saya mengambil beberapa aturan tentang bagaimana potongan-potongan itu bergerak. Karena saya tidak merasa ingin mempelajari gerakan optimal untuk setiap situasi, aturan untuk gerakan kulit putih sederhana: Tetap tak terkendali, tangkap bagian peringkat tertinggi yang bisa dia putar, sambil kehilangan bahan sesedikit mungkin, dan hentikan gadai dari mempromosikan, dalam urutan prioritas itu. Jika ada dua ruang yang dapat ia pindahkan, dengan tingkat kesukaan yang sama, ia dapat pindah ke salah satu (maka dalam hal ini, jika ia dapat pindah ke lebih dari satu kotak, mereka memiliki warna yang sama). Perhatikan bahwa putih akan ditangkap dengan sesuatu bahkan jika itu ditangkap, jika bagian yang diserang lebih tinggi nilainya daripada yang hilang. Nilai ada di sini:
pawn<knight=bishop<rook<queen
Masukan adalah apakah ada benteng atau tidak. Perhatikan bahwa rook hanya diberi label dengan nama A dan B ketika itu penting: jika gerbang berperilaku sama ketika rooks diaktifkan, mereka tidak diberi label.
Outputnya adalah warna raja putih persegi berakhir pada: Putih = 1, hitam = 0
Sebelum foto, saya ingin meminta maaf untuk gambar yang buruk. Saya tidak pandai memegang kamera dengan stabil.
Salah, 4:
DAN, 4:
A dan bukan B, 5 (saya pikir saya bisa mendapatkan ini hingga tiga, tetapi tidak memiliki papan sekarang):
A, 4:
Bukan A dan B, 5 (saya pikir saya bisa mendapatkan ini hingga tiga, tetapi tidak memiliki papan sekarang):
B, 4:
Xor, 5 (Saya tahu cara membuatnya 4, tapi saya tidak memiliki papan sekarang):
Atau, 4:
Juga, 4:
Xnor, 5 (Saya tahu cara membuatnya 4, tapi saya tidak memiliki papan sekarang):
Bukan B, 4:
B menyiratkan A, 5 (saya pikir saya bisa mendapatkan ini hingga tiga, tetapi tidak memiliki papan sekarang):
Bukan A, 4:
A menyiratkan B, 5 (saya pikir saya bisa mendapatkan ini hingga tiga, tetapi tidak memiliki papan sekarang):
Nand, 4:
Benar, 4:
sumber
Jelly , 19 byte
Cobalah online!
sumber
¤
dan¬
2 byte, bukan 1.0 0 1 0 > 1 byte Greater than.
bukankah ini akan gagal jika input kedua negatif?Gerbang logika NAND - 31 gerbang
Sebagai pencipta asli seri dari NAND gerbang pertanyaan , saya tidak bisa melewatkan kesempatan untuk menggunakan gerbang ini untuk memecahkan masalah lain gerbang logika.
Di masing-masing diagram ini, input atas adalah A sedangkan input bawah adalah B.
sumber
Tag Bitwise Cyclic , 118 bit = 14,75 byte
Bitwise Cyclic Tag mungkin adalah bahasa lengkap Turing-lengkap yang pernah dibuat. Ada rekaman program dan rekaman data, keduanya terdiri dari daftar bit. Pita program ditafsirkan secara siklis sampai rekaman data kosong, sebagai berikut:
0
: hapus bit pertama dari rekaman data.1x
: jika bit pertama dari rekaman data adalah 1, tambahkan bitx
ke rekaman data.Kami menginisialisasi rekaman data dengan angka 1 diikuti oleh dua bit input (angka 1 diperlukan karena tidak ada cara untuk membuat angka 1 jika pita data seluruhnya terdiri dari 0s), dan kami menggunakan bit data akhir yang dihapus sebagai keluaran gerbang. .
false
):001
and
):1001001
A and not B
):0110100
A
):1001
not A and B
):0100
B
):0
xor
):0110110010
or
):0110
nor
):1101001000
xnor
):110101001100
not B
):1100100
B implies A
):110101101000
not A
):11010000
A implies B
):11010011001
nand
):10110100100010
true
):1100
sumber
1
padafalse
diperlukan?0
ke rekaman agar dapat dihapus terakhir.Python 2, 137 byte
Mengambil input seperti
min(True,False)
(atau sebagaimin(1,0)
). Mengambil keuntungan besar dari keluaran hanya perlu memiliki nilai Truthy-Falsey yang tepat. Kapan pun memungkinkan, gunakan built-in untuk menghindari yang mahallambda
. Saya menggunakan kode untuk mencari built-in yang berfungsi.Yang favorit saya adalah
{0:1}.get
, yang saya pikirkan dengan tangan. Kamus{0:1}
memetakan kunci0
ke nilai1
. Itsget
metode mengambil kunci dan default, keluaran nilai yang cocok dengan kunci, atau default jika tidak ada kunci seperti. Jadi, satu-satunya cara untuk menghasilkan a0
adalah dengan{0:1}.get(1,0)
, dengan kunci yang hilang1
dan default0
. Orang bisa mendapatkan varian lain dengan kamus yang berbeda, tetapi hanya yang ini yang terpendek.sumber
__lt__
atau__eq__
? Ini akan semakin mengurangi jumlah byte:int.__gt__
alih- alihlambda a,b:b<1
,int.__eq__
bukannyalambda a,b:a==b
dan seterusnyaint
s offload perbandingan untukcmp
. Saya belum mencoba ini untuk Python 3.not
untuk0001
,False
- ideonenot
tidak memenuhi persyaratan fungsi karena Anda tidak bisa melakukannyaf=not;f(3,4)
. Stringnot
terjadi berfungsi karena argumen fungsi yang seharusnya terlihat seperti tuple, sama seperti3+
akan berfungsi seolah3+(4)
-olah3+
bukan fungsi yang dapat diambil4
sebagai input.Go (game), 33 batu, 73 persimpangan
Jika domino dan catur dapat diterima, maka ini. Tidak bisa terlalu golf dengan papan Go 19x19 penuh. Jadi saya menggunakan papan persegi panjang kecil. Masukan adalah apakah batu bertanda 1 dan 2 ada. Outputnya adalah apakah hitam menang. Ini menggunakan penilaian area, 0,5 komi, superko situasional, tidak bunuh diri. Semua hitam untuk dimainkan. Beberapa diberikan beberapa solusi.
Kemenangan putih (2, 1x5):
1 dan 2 (3, 2x3):
1 dan bukan 2 (2, 1x5):
1 (2, 1x5):
Bukan 1 dan 2 (2, 1x5):
2 (2, 1x5):
1 xor 2 (2, 2x3):
1 atau 2 (2, 1x5):
1 atau 2 (2, 1x4):
1 = 2 (2, 1x7):
Bukan 2 (2, 1x3):
1 atau tidak 2 (2, 1x4):
Bukan 1 (2, 1x3)
Bukan 1 atau 2 (2, 1x4):
1 dan 2 (2, 1x3):
Kemenangan hitam (2, 1x3):
Halaman ini sedikit membantu saya: http://www.mathpuzzle.com/go.html
Mungkin seseorang dapat menemukan solusi 2 batu untuk 1 dan 2 pada papan 1x9 ...
sumber
Javascript ES6, 124 byte
Saya sangat membenci lambda sekarang.
sumber
a=>b=>0
kea=>0
dan mengatakan tata bahasa menyebutnya adalah(a=>0)(a,b)
, hanya bagi mereka 4 entri.Math.min
bukannyaa=>b=>a&b
.Math.max
bukannyaa=>b=>a|b
.Math.pow
bukannyaa=>b=>a>=b
.parseInt
bukana=>b=>a>b
.!NaN
=>true
,!!NaN
=>false
Retina ,
6239 byte23 byte berkat @MartinEnder !
Mengambil input sebagai
PQ
.Menghasilkan bilangan bulat antara
0
hingga3
.0
adalah falsey, yang lain adalah kebenaran.Penjelasan
Mereka semua hanya regex .
Misalnya,
01|10
hanya cocok01
atau10
.Di
0000
,2
tidak akan pernah ada di input, jadi tidak pernah cocok.Di
1111
, itu cocok dengan string kosong, yang ada4
.sumber
^1|0$
seharusnya hanya cocok dengan 1 karakter string. Apa yang terjadi di sini?1
pada awal input] ATAU [0
pada akhir input]. Butuh waktu sebentar untuk mendapatkannya juga ...^1|0$
lebih sulit dibaca daripada1.|.0
. Tampaknya membuat membaca semakin sulitStack Cats , 67 + 64 = 131 bytes
Perhatikan bahwa +64 berasal dari penerapan
-nm
flag ke setiap program.-n
menunjukkan angka I / O, dan-m
mencerminkan kode sumber di seluruh karakter terakhir - tidak semua pengiriman membutuhkan tanda ini secara teknis, tetapi untuk konsistensi dan kesederhanaan saya membuat skor dengan cara yang sama.()
di Stack Cats memeriksa apakah suatu elemen positif atau tidak positif (yaitu 0 atau negatif), jadi kami menggunakannya untuk masing-masing kebenaran / kepalsuan. Kolom kedua hanya untuk minat, dan daftar gerbang terbaik dengan0
/1
s sebagai output (dengan skor total 90).Input adalah bit yang dipisahkan oleh pembatas melalui STDIN. Cobalah online!
Stack Cats adalah bahasa esoterik yang dapat dibalik, di mana program memiliki simetri reflektif. Diberikan potongan
f
(misalnya>[[(!-)/
), gambar cermin (misalnya\(-!)]]<
) menghitung kebalikannyaf^-1
. Dengan demikian, bahkan program panjang tidak melakukan apa-apa (atau terjebak dalam loop tak terbatas), dan satu-satunya program non-sepele memiliki panjang ganjil, menghitung dif g f^-1
manag
operator pusat.Karena separuh kode sumber selalu berlebihan, ia dapat ditinggalkan, dan menjalankan kode dengan
-m
bendera menunjukkan bahwa kode sumber harus dicerminkan pada karakter terakhir untuk mengambil kode sumber yang sebenarnya. Misalnya, programnya*<X
sebenarnya*<X>*
, yang simetris.Golf di Stack Cats sangat tidak intuitif, sehingga program di atas harus ditemukan dengan kekerasan. Kebanyakan dari mereka sangat kompleks, tetapi saya akan menjelaskan beberapa dan menambahkan jawaban ini ketika saya punya waktu. Untuk saat ini, beberapa penjelasan dan solusi alternatif untuk
0
/1
versi dapat ditemukan di repositori Github di sini .sumber
Note that the +64 is from applying the -nm flags to each program.
3 * 16 = 48 atau 2 * 16 = 32, bagaimanapun juga 64 adalah cara haiHaskell,
787675 byte_#_=2<1
&&
>
pure
<
_#b=b
/=
||
(not.).max
==
_#b=not b
>=
a#_=not a
<=
(not.).min
_#_=1<2
Sunting: -1 byte berkat @cole.
sumber
_#_
bukan operator standar!" Dan kemudian saya menyadari ... Bagus sekali.pure
pure
diperkenalkanPrelude
kembali pada tahun 2015, jadi itu tersedia pada saat tantangan ini.Brachylog ,
3634 byteIni mengharapkan
0
nilai palsu dan1
nilai kebenaran. Pengembaliantrue
ataufalse
. p adalahInput
dan q adalahOutput
.sumber
Input
danOutput
menurut konvensi, tetapi Anda dapat menetapkan nilai untuk keduanya, atau mengembalikan nilai dari keduanya.Prolog,
147145 byteMemperoleh 2 byte berkat @SQB
Permintaan
x(P,Q).
denganx
menjadi huruf yang sesuaiP
danQ
diatur ke 0 atau 1.Mengembalikan
true
ataufalse
.Contoh SWISH termasuk tes - masuk
runTest.
untuk menjalankan.sumber
a(2,2).
kesalahan?a(a,a).
(atau surat lainnya) bekerja juga dana
bukan input yang dapat diterima untuk kebenaran, jadi itu bagus. Terima kasih untuk sarannya.NTFJ, 86 byte
Coba di sini! Tapi baca dulu di bawah ini.
Input tersirat pada stack. Hasilnya biarkan di stack. Tambahkan 16 byte (satu
*
ke akhir masing-masing) jika Anda ingin0x00
atau0x01
untuk output yang mewakili 0 dan 1. Tambahkan 160 byte tambahan jika Anda ingin0
atau1
dicetak. (Letakkan~~##~~~#{@
sebelum masing-masing*
.)Satu-satunya operator biner NTFJ adalah NAND, sehingga masing-masing ditulis dalam bentuk NAND.
Mari kita telusuri masing-masing.
0: salah
~
mewakili bit yang salah. Cukup sederhana. Karena input tersirat di bagian bawah tumpukan, ini dibiarkan di atasnya.1: p dan q
NTFJ beroperasi pada stack.
:
adalah perintah untuk duplikat. Amatip and q
≡not (p nand q)
dan itunot q = q nand q
.(Catatan, kemudian,
:|
bisa dikatakan negasi dan|:|
bisa dikatakan konjungsi )2: p dan bukan q
Perhatikan bahwa ini hanya negasi,
:|
dan konjungsi|:|
.3: hal
$
muncul item dari tumpukan. Jadi ... ya.4: bukan p dan q
Ini sama dengan 2, kecuali dengan
#{
di awal.#
mendorong 1 (bit sebenarnya) dan{
memutar tumpukan ke kiri satu kali. Cukup sederhana.5: q
Putar ke kiri satu kali, jatuhkan.
6: xor
Mengamati:
Namun, tidak ada cara untuk menggandakan tumpukan seluruhnya. Jadi, kita harus membawa masing-masing
p
,q
ke atas dan menduplikasinya.Dan dengan demikian, kita memiliki xor kita.
7: p atau q
Meniadakan atas, membawa bawah ke atas, meniadakan itu, dan mengumpulkan mereka Pada dasarnya
p or q = (not p) nand (not q)
,.8: bukan p dan bukan q
Ini hanyalah negasi dari 7. Mudah.
9: eq
Ini hanya xnor , atau bukan xor. Sederhana lagi.
10: bukan q
Negasi 5.
11: p atau tidak q
Meniadakan p, nand.
(not p) nand q = not ((not p) and q) = p or (not q) (by De Morgan's laws)
.12: tidak hal
Jatuhkan, berhenti, dan negasikan.
13: bukan p atau q
Hukum De Morgan untuk menyelamatkan hari, lagi! Proses yang sama dengan 11, hanya meniadakan
q
bukannyap
.14: bukan p atau tidak q
Ini hanya meniru nand.
15: benar
#
adalah bit yang benar.sumber
:|
?Minecraft, 89 blok
Di semua foto berikut, blok biru untuk Input A dan blok oranye untuk Input B
16. Gerbang yang BENAR - 1 blok
15. Gerbang NAND - 1x2x3 = 6 blok
14. A => B - 1x2x3 = 6 blok
13. BUKAN A - 2 blok
12. B => A - 1x2x3 = 6 blok
11. TIDAK B - 2 blok
10. XNOR - 1x3x4 = 12 blok
9. NOR - 1x2x3 = 6 blok
8. ATAU - 1 blok
7. XOR - 1x3x4 = 12 blok
6. B - 1 blok
5.! A&B - 1x2x5 = 10 blok
4. A - 1 blok
3. A &! B - 1x2x5 = 10 blok
2. DAN - 2x2x3 = 12 blok
1. SALAH-1 blok
sumber
Mathematica, 67 byte
Masing-masing mengevaluasi fungsi, sehingga Anda dapat menggunakannya seperti
Ah, jika hanya bilangan bulat yang benar / salah dalam Mathematica, empat yang lebih panjang itu bisa dipersingkat.
sumber
MATL,
3423 byteSaya harap saya mendapat pesanan baik-baik saja! Nol adalah falsey, bukan-nol adalah benar. Setiap fungsi mengambil dua input implisit (meskipun mungkin mengabaikan beberapa input). Input pertama adalah A, dan yang kedua adalah B. Anda dapat memasukkan
0
/1
untuk true / false, atauT
/F
.Berikut adalah contoh TryItOnline untuk test case 3.
Disimpan 4 byte dengan menggunakan
*
forand
, dan 4 lainnya dengan menggunakan>
/<
bukannya~wY&
/w~Y&
setelah saya melihat jawaban Dennis!sumber
-
dc, 37 byte
dc
("desk calculator") adalah perintah unix standar, kalkulator postfix berbasis stack. Ini tidak memiliki operasi bit, dan operator perbandingan hanya dapat digunakan untuk menjalankan makro (yang tidak sebanding dengan byte). Divisi integer menutupi sebagian dari itu.Script ini mengharapkan
0
dan memberi1
nilai pada stack, dan meninggalkan hasilnya pada stack.sumber
Labirin , 85 byte
Terima kasih kepada Sp3000 untuk menghemat 2 byte.
Semua ini adalah program lengkap, membaca dua bilangan bulat
0
atau1
dari STDIN (menggunakan pemisah non-digit), dan mencetak hasilnya sebagai0
atau1
ke STDOUT.Cobalah online! (Bukan test suite, jadi Anda harus mencoba berbagai program dan input secara manual.)
Adapun penjelasan, ini semua cukup mudah. Semua program bersifat linier, dan perintah yang digunakan melakukan hal berikut:
Perhatikan bahwa saya menggunakan
#
selalu digunakan untuk menggabungkannya$
, yaitu untuk menghitungXOR 1
, atau dengan kata lain untuk negasi logis. Hanya dalam beberapa kasus saya dapat menggunakan~
sebagai gantinya, karena selanjutnya&
membuang semua bit yang tidak diinginkan dari hasil-1
atau-2
.sumber
Kode mesin IA-32, 63 byte
Hexdump kode, dengan pembongkaran:
Kode lebih panjang dari yang seharusnya, karena menggunakan konvensi pengkodean standar: input
ecx
danedx
, dan output dalamal
. Ini dapat dinyatakan dalam C sebagaiTampaknya MS Visual Studio tidak memahami
SALC
opcode tidak berdokumen , jadi saya harus menggunakan kodenya, bukan nama.Terima kasih l4m2 untuk meningkatkan beberapa contoh kode!
sumber
1110 8D4411FE LEA EAX, [ECX+EDX-2]
C 34 byte
Di mana n adalah nomor fungsi untuk digunakan, tapi saya pikir itu akan ditolak jadi saya usulkan yang lain ini:
C 244 byte (menggunakan memori)
menggunakan array indeks ganda.
n[0][1]
aku s(A implies B)(0,1)
Sebanyak 138 byte
Saya baru belajar Forth. Saya kira itu Ansi Forth kompatibel karena dijalankan juga di gforth.
Fungsi z membuat fungsi baru dengan nama yang disediakan kemudian memasukkan nomor gerbang logika dari atas tumpukan ke alamat fungsi baru. Ini meninggalkan fungsi gerbang logika (n +1) berikutnya di stack untuk deklarasi berikutnya.
Anda dapat mengujinya:
Dan AB
("." cetak bagian atas tumpukan "cr" adalah pengembalian cariage)
sumber
C, 268 byte
Macro tampak lebih pendek dari fungsi.
sumber
Brian & Chuck , 183 byte
Terima kasih kepada Sp3000 untuk menghemat 4 byte.
Beberapa program berisi karakter yang tidak patut dicetak. Secara khusus, setiap
\x01
harus diganti dengan<SOH>
karakter kontrol (0x01):Input dan output menggunakan nilai byte , jadi input harus dua byte 0x00 atau 0x01 (tanpa pemisah) dan output akan menjadi satu byte tersebut. Ini sebenarnya juga merupakan definisi paling masuk akal dari kebenaran / kepalsuan untuk B&C karena satu-satunya perintah aliran kontrol
?
menganggap nol sebagai kepalsuan dan segala sesuatu yang lain benar.Penjelasan
Pertama primer B&C cepat:
,
(byte input) dan hanya Chuck yang dapat menggunakan perintah.
(byte keluaran).[]
Loop Brainfuck tidak ada. Alih-alih, satu-satunya aliran kontrol yang Anda miliki adalah?
yang mengalihkan kontrol ke instance lain jika jika nilai saat ini di bawah head tape adalah nol.>
dan<
, ada{
dan}
yang pada dasarnya setara dengan cuplikan Brainfuck[<]
dan[>]
, yaitu, mereka memindahkan kepala kaset ke posisi nol berikutnya ke arah itu. Perbedaan utama adalah bahwa hal itu{
juga dapat dihentikan di ujung kiri kaset, terlepas dari apa nilainya._
s dalam kode sumber diganti dengan null-byte (karena ini sangat berguna dalam program nontrivial untuk menangkap{
dan}
).Perhatikan bahwa dalam semua program, rekaman Chuck dimulai dengan a
#
. Ini bisa jadi apa saja.?
berfungsi sedemikian rupa sehingga kepala kaset bergerak satu sel sebelum memulai eksekusi (sehingga kondisi itu sendiri tidak dieksekusi jika kebetulan itu adalah perintah yang valid). Jadi kita tidak akan pernah bisa menggunakan sel pertama Chuck untuk kode.Ada lima kelas program, yang akan saya jelaskan nanti. Untuk sekarang saya daftar mereka di sini dalam rangka meningkatkan kompleksitas.
0000
,1111
: Fungsi konstanIni sangat sederhana. Kami beralih ke Chuck tanpa syarat. Chuck memindahkan kepala kaset ke sel yang tidak digunakan ke kanan dan mencetaknya secara langsung, atau menambahkannya terlebih dahulu untuk dicetak
1
.0011
,0101
,1010
,1100
: Fungsi tergantung hanya pada satu inputBergantung pada apakah kita mulai dengan
,
atau,,
sedang kita kerjakanA
atauB
. Mari kita lihat contoh pertama0011
(yaituA
). Setelah membaca nilai, kami menggunakan?
sebagai syarat pada nilai itu. JikaA = 1
, maka ini beralih ke Chuck, yang menggerakkan kepala kaset ke kanan dan mencetak1
-byte yang tertanam secara harfiah . Kalau tidak, kontrol tetap ada pada Brian. Di sini, 1-byte adalah no-op. Lalu kami menambah input dengan baik+
untuk memastikan itu bukan nol dan kemudian beralih ke Chuck?
. Kali ini,>
pindah ke sel yang tidak digunakan ke kanan yang kemudian dicetak sebagai0
.Untuk meniadakan salah satu nilai, kita cukup menguranginya
-
. Ini berubah1
menjadi0
dan0
menjadi-1
, yang tidak nol dan karenanya benar sejauh?
yang bersangkutan.0001
,0010
,0100
,1000
: Fungsi Biner dengan satu hasil truthyIni adalah perpanjangan dari ide sebelumnya untuk bekerja dengan dua input. Mari kita lihat contoh
1000
(NOR). Kami (berpotensi) membaca kedua input dengan,?
. Jika salah satunya adalah1
,?
beralih ke Chuck. Dia memindahkan kepala kaset ke ujung dengan}
(ke sel kosong setelah kode Brian), memindahkan sel lain dengan>
(masih nol) dan mencetaknya dengan.
.Namun, jika kedua input adalah nol, maka kontrol masih dengan Brian.
>
lalu pindahkan head tape ke}
sedemikian rupa sehingga perintah ini tidak dijalankan ketika kita beralih ke Chuck?
. Sekarang semua yang dilakukan Chuck adalah>.
yang hanya bergerak ke1
-sel dan mencetaknya.Kita dapat dengan mudah mendapatkan tiga fungsi lainnya dengan meniadakan satu atau kedua input sesuai kebutuhan.
0111
,1011
,1101
,1110
: Fungsi Biner dengan tiga hasil truthySebuah modifikasi kecil dari ide sebelumnya untuk meniadakan hasil (yaitu cetak
0
ketika kita telah melewati semua Brian dan1
sebaliknya). Mari kita lihat0111
(OR) sebagai contoh. Perhatikan bahwa1
-byte tertanam adalah no-op, jadi ini masih dimulai dengan,?,?
. Jika salah satu input1
kita beralih ke Chuck, yang memindahkan kepala kaset kembali ke awal dengan{
.>.
memindahkan kepala kaset ke1
-byte itu dan mencetaknya.Jika kedua input nol maka kita tetap dengan Brian, pindahkan head tape ke
{
untuk melewati itu dan kemudian beralih ke Chuck. Ketika dia mengeksekusi>.
kali ini dia bergerak ke sel kosong setelah kode Brian dan mencetak0
.Sekali lagi, kami dengan mudah mendapatkan fungsi-fungsi lain dengan meniadakan satu atau kedua input.
0110
,1001
: Fungsi biner dengan dua hasil yang benarYang ini agak rumit. Fungsi sebelumnya cukup sederhana karena dapat dihubung pendek - nilai input pertama dapat menentukan output, dan jika tidak maka kita melihat input lainnya. Untuk dua fungsi ini, kita selalu perlu melihat kedua input.
Ide dasarnya adalah menggunakan input pertama untuk memutuskan apakah input kedua memilih antara
0
dan1
atau antara1
dan0
. Mari kita ambil0110
(XOR) sebagai contoh:Pertimbangkan
A = 0
. Dalam hal ini kami ingin menampilkanB
apa adanya.,
berbunyiA
,?
tidak melakukan apa-apa.>
bergerak ke sel (bukan nol) berikutnya sehingga}
membawa kita ke_
pada Chuck. Di sini, kami membacaB
dengan,
dan menggunakan?
lagi. JikaB
itu0
juga, kami masih pada Brian.>
melompati}
Chuck dan?
beralih sehingga>.
mencetak0
tertanam dalam kode sumber Brian. JikaB
berada1
di sisi lain, Chuck mengeksekusi}
yang bergerak ke_
dalam kode Brian, jadi>.
kemudian mencetak1
-byte sebagai gantinya.Jika
A = 1
, maka kita langsung beralih ke Chuck, siapa yang akan mengeksekusi}+{>?
. Apa yang dilakukan adalah pindah ke_
dalam kode sumber Brian, mengubahnya menjadi1
juga dengan+
, kemudian bergerak kembali ke awal{
dan melompati Brian?
dengan memindahkan satu sel ke kanan dengan>
sebelum menyerahkan kontrol kembali kepadanya. Kali ini, setelah Brian membaca iniB
, jikaB = 0
, dan Chuck menggunakan>.
sel sebelah Brian?
akan1
bukannya0
. Juga, ketikaB = 1
, Chuck}
melompati apa yang seharusnya menjadi celah dan bergerak sampai ke ujung kaset, sehingga>.
mencetak angka nol sebagai gantinya. Dengan cara ini kita mencetaknot B
.Untuk menerapkan kesetaraan, kami cukup menegasikan
A
sebelum menggunakannya sebagai syarat. Perhatikan bahwa karena ini, kita juga perlu menambahkan yang lain>
ke Chuck untuk melewati itu-
juga ketika kembali ke awal.sumber
ClojureScript,
88 84 7674 bytenil
danfalse
palsu, semua nilai lain adalah benar. Booleans memaksa ke 0/1 untuk aritmatika dan ketidaksetaraan. Fungsinya dapat mengambil jumlah argumen yang salah.sumber
0
palsu?not not(0)
keFalse
, yang merupakan nilai falsey.#f
,f
,false
, dll) adalah Salah. Semua nilai lain benar dalam sebagian besar bahasa fungsional.Brainfuck ,
184178174 byteInput / output menggunakan U + 0000 dan U + 0001.
sumber
0001
Anda tidak bisa hanya melakukan,[,>]<.
(diberi juru bahasa yang memungkinkan Anda untuk pergi ke kiri dari sel awal)?Brain-Flak ,
418, 316 byteCobalah online!
Biarkan input menjadi dua angka teratas pada stack pada awal program (nol untuk false salah untuk true) dan output menjadi atas tumpukan di akhir program (nol untuk false else untuk true).
false, 4 bytes (Sumber Leaky Nun )
(<>)
dan, 36 byte
(({}{}[(())()])){{}{}(((<{}>)))}{}{}
A dan bukan B, 40 byte
((({}){}{}[(())()])){{}{}(((<{}>)))}{}{}
A, 6 byte
({}<>)
bukan A dan B, 38 byte
((({}){}{}[(())])){{}{}(((<{}>)))}{}{}
B, 2 byte
{}
xor, 34 byte
(({}{}[(())])){{}{}(((<{}>)))}{}{}
atau, 6 byte
({}{})
atau 34 byte
(({}{}<(())>)){{}{}(((<{}>)))}{}{}
xnor, 10 byte
({}{}[()])
bukan B, 34 byte
{}(({}<(())>)){{}{}(((<{}>)))}{}{}
B menyiratkan A, 14 byte
(({}){}{}[()])
bukan A, 34 byte
(({}<{}(())>)){{}{}(((<{}>)))}{}{}
A menyiratkan B, 16 byte
(({}){}{}[()()])
nand, 12 byte
({}{}[()()])
true, 6 byte
<>(())
Penjelasan
Karena sebagian besar sangat mirip, saya tidak akan menjelaskan dengan tepat bagaimana masing-masing bekerja. Saya mencoba yang terbaik untuk memperjelas bagaimana semua enam belas bekerja.
Pertama adalah gerbang yang mengembalikan tiga dari nilai yang sama (yaitu 2, 3, 5, 8, 9, 12, 14, dan 15). Semua ini mengikuti pola yang sama. Pertama, Anda mengubah input menjadi angka dua bit dengan tempat as dua dan B sebagai yang. Ini dilakukan dengan potongan ini
(({}){}{})
. Anda kemudian kurangi nilai input dua bit yang ingin Anda isolasi({}[value])
. (Dalam kode aktual, pengurangan dan konversi dilakukan dalam satu langkah untuk menghemat byte). Hal ini dapat dikombinasikan dengan tidak jika diperlukan:(({}<(())>)){{}{}(((<{}>)))}{}{}
.Selanjutnya: dan, atau, atau, xor, dan xnor. Ini bekerja sama dengan yang di atas. Sebenarnya beberapa di antaranya termasuk di atas, namun metode ini lebih pendek. Trik yang saya gunakan di sini adalah bahwa masing-masing ini sesuai dengan jumlah A B. misalnya xor bernilai true jika A + B = 1 dan false jika tidak. Pertama, Anda tambahkan AB dan kurangi jumlah yang relevan. Dinyatakan sebagai
({}{}[0,1,2 or 3])
. Lalu jika perlu lakukan yang tidakSelanjutnya: A, B, bukan A dan bukan B. Ini cukup jelas. Kita mulai dengan menghapus nilai yang tidak perlu dan kemudian kita meniadakan atau menyelesaikannya.
Terakhir adalah dua simpletons: true dan false. Untuk ini, kami mendorong nilai yang benar ke tumpukan off. The
<>
pengembalian nilad nol sehingga kita bisa menghemat dua byte dengan menggunakan saklar sebagai nilai nol.Bukan solusi yang paling efisien di luar sana (mungkin yang paling efisien di Brain-Flak), tapi saya sangat senang menulis ini dan saya mohon Anda untuk mencoba mempersingkat ini.
sumber
(<>)
cukup untukfalse
; juga,(<{}{}>)
adalah 8 byte(<>)
akan meninggalkan input dan meletakkan nol di tumpukan lainnya.<>
cukup untukfalse
karena nol tersirat? Juga, saya pikira
bisa menjadi program kosong.true
bisa<>[][]
(tidak menyimpan byte, tetapi terlihat keren: P).ProgFk ,
18,517,5 byteKarena instruksi ProgFk ditentukan dalam nibbles, kode di bawah ini diberikan dalam heksadesimal, satu gerbang logika per baris dan dengan spasi di antara byte.
Penjelasan
ProgFk adalah esolang berbasis tape (mirip dengan Brainfuck) di mana setiap sel sedikit dan instruksi diberikan sebagai nibble (4 byte). Instruksi beroperasi pada sel yang ditunjuk oleh penunjuk instruksi. Input diberikan dalam sel pertama dan kedua (dengan
A
danB
menjadi sel pertama dan kedua masing-masing), dan penunjuk instruksi dimulai pada sel pertama. Output disimpan di sel pertama.Setiap instruksi yang digunakan dijelaskan di bawah ini.
Menyimpan satu byte berkat @LeakyNun!
sumber
Sebenarnya, 24 byte
Program-program ini mengambil input sebagai
A\nB
(dengan\n
mewakili baris baru), yang meninggalkan B di atas tumpukan, dengan A di bawah.False
diwakili oleh0
, danTrue
diwakili oleh bilangan bulat positif.Terima kasih kepada Leaky Nun selama 3 byte
sumber