Terbukti optimal!
((([()][()][()])))
Cobalah online!
Penjelasan
Brain-Flak, Brain-Flueue, Miniflak, dan Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Ini mencetak:
-3
-3
-3
(Ada baris baru yang tertinggal)
Brain-Flak Classic
Brain-Flak Classic adalah versi asli dari Brain-Flak dan memiliki beberapa perbedaan penting dari Brain-Flak modern. Dalam BFC [...]
mencetak isinya daripada meniadakannya.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
Di akhir mengeksekusi isi stack ( 3 3 3
) dicetak.
Ini mencetak:
1
1
1
3
3
3
(Ada baris baru yang tertinggal)
Flakcats
Flakcats sangat berbeda dari 4 flak lainnya dan saya terkejut bahwa ini bekerja di Flakcats. Tiga operator di sini hampir sama dengan yang digunakan Brain-Flak.
Perbedaan utama dalam program khusus ini antara Flakcats adalah (...)
operator yang di Flakcats setara dengan ([{}]...)
di Brain-Flak. Namun ini tidak membuat perbedaan bagi kami karena mengambil nol dan dengan demikian beroperasi banyak dengan cara yang sama seperti Brain-Flak.
Inilah program yang dikompilasi ke dalam Brian-Flak:
([{}]([{}]([{}][()][()][()])))
Ini mencetak:
-3
-3
-3
(Ada baris baru yang tertinggal)
Bukti Optimalitas pada Brain-Flak dan Miniflak
Ini bukan bukti formal, melainkan bukti informal yang harus diperluas agar dibuat lebih ketat
Karena pembatasan bahwa program Brain-Flak harus seimbang-string dan panjang program harus kelipatan 3, setiap pengajuan yang valid harus kelipatan 6 panjangnya. Ini berarti solusi apa pun yang lebih kecil dari 18 harus panjang 12.
Karena keluaran mengikuti baris baru, ketinggian akhir tumpukan harus kelipatan tiga atau kami akan melanggar batasan pada keluaran.
Setiap pengajuan yang valid dengan panjang 12 harus memiliki 2 jenis kawat gigi (memiliki kurang akan melanggar batasan jumlah karakter yang berbeda dan lebih banyak akan berarti lebih dari 12 karakter). Karena program menghasilkan output, ia harus memiliki dorongan.
Ini membuat kita memilih set kawat gigi kita yang lain. Opsinya adalah:
<...>/<>
Ini gagal karena kita perlu menghasilkan "nilai" untuk membuat angka selain nol kita harus menyerah ()
untuk membuat nomor yang membuatnya mustahil untuk mendorong lebih dari dua kali.
[...]/[]
Ini gagal karena alasan yang sama yang terakhir gagal. Kawat gigi kotak sangat buruk dalam menghasilkan nilai. The []
monad dapat menciptakan nilai tapi kita perlu mendorong angka pertama dan kita kemudian tidak memiliki cukup parens tersisa untuk mendorong tiga kali.
{...}/{}
Yang ini menjanjikan, kita bisa membuat loop dan menggunakannya ()
untuk mendorong beberapa kali, tapi sayangnya itu tidak mungkin.
Agar loop berakhir, harus ada nol pada stack di beberapa titik dan agar kita memiliki output yang benar, kita harus memiliki sesuatu selain nol pada stack di akhir program. Karena kita memiliki tidak []
atau <>
nol pada akhir loop harus menjadi nol implisit dari bawah tumpukan. Ini berarti loop tidak dapat menambahkan nomor baru ke tumpukan sehingga tidak berguna.
Karena tidak ada pilihan brace yang dapat membuat program dengan panjang 12, tidak ada yang bisa ada.
Karena Miniflak adalah bagian dari Brain-Flak, program Miniflak yang lebih pendek juga merupakan program Brain-Flak yang lebih pendek sehingga tidak ada.
Brain-Flueue adalah bahasa lelucon yang didasarkan pada Brain-Flak. Keduanya sangat mirip, penafsirnya identik di mana-mana kecuali dua baris. Perbedaan antara keduanya adalah, seperti namanya, Brain-Flueue menyimpan datanya dalam antrian sementara Brain-Flak menyimpan datanya di tumpukan.
Untuk memulai, kami memiliki batasan yang sama pada ukuran program yang dibuat oleh Brain-Flak, jadi kami mencari program berukuran 12. Selain itu kami akan membutuhkan (...)
untuk membuat keluaran dan pasangan lain. yang <>
dan []
pasangan tidak bekerja di Brain-Flueue untuk alasan yang sama mereka tidak bekerja di Brain-Flak.
Sekarang kita tahu bahwa program kita harus terdiri dari karakter ((())){{{}}}
.
Melalui metode yang sama yang digunakan dalam bukti sebelumnya kita dapat menunjukkan bahwa harus ada loop dalam program akhir.
Sekarang di sinilah buktinya berbeda, karena Brain-Flueue beroperasi lintas antrian daripada tumpukan, program dapat keluar dari loop dengan nilai pada antrian.
Untuk keluar dari loop kita perlu nol dalam antrian (atau antrian kosong tetapi jika antrian kosong kita mendapatkan masalah yang sama seperti Brain-Flak) ini akan berarti bahwa kita harus membuka program kami dengan ({})
membuat nol. Kami akan membutuhkan dorongan di dalam loop untuk mendorong jumlah item yang diperlukan ke antrian. Kita juga perlu menekan angka bukan nol sebelum pengulangan sehingga kita dapat memasukkan pengulangan sama sekali; ini akan dikenakan biaya minimum (())
. Kami sekarang menggunakan lebih banyak parens daripada yang kami miliki.
Dengan demikian tidak ada program Brain-Flueue untuk melakukan tugas yang 12 byte, dan lebih jauh lagi ada program kami yang optimal.
Solusi berikut optimal di Flakcats dan Brain-Flak Classic.
((([][][])))
Penjelasan
[][][] -3
((( ))) push 3 times
Alternatif 24 byte solusi Brain-Flak
(<((<((<(())>)())>)())>)
Cobalah online!
((<((<((<>)())>)())>)())
Cobalah online!
((((((()()()){}){}){})))
Cobalah online!