Ini mengejutkan rumit, dan saya tidak yakin itu optimal ...
<.@!$?
Setelah mengisi dan membuka kode, ini mewakili kisi hex berikut:
Ini menggunakan aliran kontrol yang sama seperti program kucing bebas kesalahan saya baru-baru ini , bergerak bersama anti-diagonal. Untuk mencapai itu kita mulai dengan membelokkan penunjuk instruksi (IP) ke kiri, di mana jalur ungu membungkus di sekitar sudut kiri bawah.
?
membaca input sebagai integer. !
mencetaknya kembali. .
hanyalah sebuah no-op. Sekarang sudut kisi bertindak sebagai cabang:
Jika inputnya adalah 0
, IP akan melanjutkan sepanjang jalur merah, yang dengan mudah mengakhiri program dengan @
.
Jika inputnya adalah 1
, IP akan melanjutkan di jalur hijau. Sekali lagi, .
hanya no-op, tetapi $
setara dengan trampolin Befunge: ia melompati instruksi selanjutnya. Setelah membungkus, instruksi selanjutnya adalah ?
, tetapi karena $
eksekusi sebenarnya berlanjut di jalur biru, dimulai dengan !
mencetak salinan lain dari 1
. Loop yang hanya berisi !..$
ini sekarang diulang tanpa batas.
Sebuah studi tentang aliran kontrol dalam Hexagony ...
Saya percaya solusi di atas optimal. Saya telah menulis brute forcer, yang memeriksa semua program Hexagony 6-byte, yang masing-masing berisi setidaknya satu ?!@
(yang diperlukan; Saya juga telah memeriksa :
dan %
menggantikannya @
dengan kesalahan pembagian-oleh-nol, tetapi itu tidak membantu). Cek mencetak semua program yang a) menghasilkan 0
input on 0
dan terminasi dan b) menghasilkan setidaknya dua 1
s (dan tidak ada yang lain) dan tidak berhenti dalam 60 tick pertama dari program (200 ticks untuk solusi 5-byte) . Saya ragu bahwa solusi yang valid akan membutuhkan lebih dari 200 kutu untuk mencetak yang pertama 0
atau yang kedua dengan benar 1
pada kotak kecil seperti itu, jadi saya rasa saya tidak melewatkan solusi potensial.
Pencarian tidak menghasilkan hasil apa pun untuk 5 byte, tetapi 57 hasil untuk 6 byte (menggunakan @
; tidak perlu mengakhiri dengan kesalahan jika kita dapat menyelesaikannya dengan bersih dalam jumlah byte yang sama). Dari mereka 57 hanya 6 yang positif palsu yang benar-benar dicetak hanya dua 1
s dan kemudian memasuki loop tanpa batas tanpa mencetak lagi. Satu solusi terdaftar dua kali karena mengandung dua !
perintah. Itu meninggalkan tepat 50 solusi yang valid.
Ada sejumlah kemunduran di antara solusi di mana satu atau dua karakter tidak substansial, misalnya karena mereka sebenarnya tidak bisa digunakan. Solusi dapat dikelompokkan menjadi 23 set program yang benar-benar berbeda (dalam beberapa kasus, hanya ada perbedaan karakter tunggal antara dua set, tetapi mengubah aliran kontrol secara substansial, jadi saya sudah menghitungnya secara terpisah). Dua kelompok bahkan menggunakan banyak petunjuk instruksi dengan cara yang sangat tidak terduga. Karena saya tidak akan pernah menemukan sebagian besar cara-cara ini untuk menggunakan cabang dan cermin, mereka membuat studi yang sangat menarik tentang aliran kontrol macam apa yang mungkin ada di Hexagony, dan saya pasti telah mempelajari beberapa trik baru untuk golf masa depan.
The keseluruhan aliran kontrol hampir selalu sama: membaca nomor, mencetaknya. Jika itu 0
menemukan cara untuk @
, jika tidak terus melalui perulangan !
sambil mempertahankan nilai tepi 1
. Ada empat pengecualian penting:
- Satu solusi (satu dengan dua
!
) mencetak dua 1
per per iterasi melalui kisi, sehingga mencetak sekitar dua kali lebih cepat dari mayoritas program. Saya sudah menandai yang ini dengan di x2
bawah ini.
- Beberapa solusi (yang berisi a
o
) ganti 1
dengan a 111
(kode karakter o
), sehingga mereka mencetak tiga 1
s per iterasi, membuat mereka mencetak sekitar tiga kali lebih cepat dari mayoritas program. Saya sudah menandai ini dengan di x3
bawah ini.
- Dua solusi menambahkan sebuah
1
dengan nilai tepi dalam setiap iterasi (jadi 1
-> 11
-> 111
-> ...). Mereka mencetak dengan sangat cepat, tetapi pada akhirnya mereka akan kehabisan memori. Saya sudah menandai ini dengan di OoM
bawah ini.
- Dua solusi memasuki loop yang sangat ketat yang hanya memantul ke depan dan ke belakang
!
, mencetak setiap centang lainnya (bukan setiap 5 atau lebih), yang membuatnya sedikit lebih cepat (dan lebih rapi). Saya sudah menandai ini dengan di ><
bawah ini.
Jadi di sini adalah seluruh kebun binatang:
#1 #5 #12 #19
?!/$.@ ?$!>$@ .?!/$@ |!|?$@ # ><
?!/$1@ # OoM ?$!|$@ =?!/$@
?!/$=@ #20
?!/$\@ #6 #13 $@.?<!
?!/$o@ # x3 ?/!<|@ .?/!$@ $@1?<! # OoM
?!/$!@ # x2 =?/!$@ $@=?<!
#7 $@o?<! # x3
#2 ?\!<|@ #14
?!>$)@ \!?__@ #21
?!>$1@ #8 _>_!?@
?!>$o@ # x3 ?<!>$@ # >< #15
?!|$)@ \_?!$@ #22
?!|$1@ #9 <!@.$?
?!|$o@ # x3 ?\$!@$ #16 <!@/$?
\_?!_@ <!@=$?
#3 #10 <$@!$?
?!|)$@ ?~#!@) #17 <.@!$?
?!|1$@ ?~#!@1 $$?\@! </@!$?
?!|o$@ # x3 <=@!$?
#11 #18
#4 ?$)\@! \$?\@! #23
?_!<@> ?$1\@! <<@]!?
?$o\@! # x3
Berikut ini adalah langkah-langkah singkat untuk beberapa kelompok yang lebih representatif. Khususnya kelompok 10 dan 23 patut dicoba. Ada banyak jalan lain yang menarik dan terkadang berbelit-belit di kelompok lain, tapi saya pikir saya sudah cukup bosan pada akhir ini. Bagi siapa pun yang benar-benar ingin belajar Hexagony, ini pasti patut diselidiki, karena mereka menunjukkan kemungkinan penggunaan cermin yang lebih banyak $
.
Grup 1
Yang ini tidak lebih rumit dari solusi asli saya, tetapi jalan menuju ke arah yang berbeda. Ini juga memungkinkan untuk variasi jumlah terbesar dalam sel tunggal, karena hak-no-op paling kanan dapat diganti dengan 5 perintah berbeda yang masih menjadikan ini valid tanpa mengubah struktur:
Grup 2
Yang ini cukup menarik, karena hanya bergerak secara horizontal. Setelah membungkus ke >
, IP membalikkan segera, mengambil cabang di sudut. Tidak sepenuhnya terlihat diagram, tetapi dalam kasus 1
kita melintasi baris pertama lagi, tapi mundur kali ini. Ini juga berarti kita bertemu ?
lagi, yang sekarang kembali 0
(EOF). Ini diperbaiki dengan )
(kenaikan) untuk tetap mencetak 1
s. Ini juga memiliki 5 variasi, seperti )
bisa juga 1
atau o
, dan >
bisa juga |
:
Grup 3
Yang ini terlihat hampir identik dengan yang sebelumnya tetapi sangat berantakan. Hingga memukul |
dan kemudian melintasi baris bawah atau atas itu sama. Tapi dalam kasus loop, yang $
sekarang melompat di atas )
ke cermin. Jadi kita mengikuti jalan pirus ke kanan, sekarang tekan kenaikan, lewati @
sebelum kita membungkus |
lagi dan kemudian kembali ke jalur hijau di atas.
Grup 4
Saya pikir ini sangat bagus:
The _
cermin di sudut kanan atas pada awalnya tidak-op, jadi kami mencetak dengan !
dan memukul <
. The 0
path sekarang hits cermin horisontal dan berakhir. The 1
path mengambil lintasan benar-benar menarik meskipun: itu mengalihkan ke bawah, membungkus dengan !
, akan diarahkan menuju horizontal dan kemudian membungkus kembali ke !
lagi . Kemudian terus bergerak dalam bentuk belah ketupat ini, mencetak dua kali per iterasi (setiap centang ketiga).
Grup 8
Ini adalah salah satu dari dua solusi dengan lingkaran pencetakan yang sangat ketat:
The <
bertindak sebagai cabang. Setelah membungkus dua kali, 0
klik @
. 1
di sisi lain, pertama melewatkan ?
, kemudian >
mengirimkannya ke $
lagi, sehingga melewatkan @
. Kemudian IP membungkus ke dalam jalur pirus, di mana ia memantul bolak-balik antara >
dan <
(membungkus tepi di antara).
Grup 10
Salah satu dari dua kelompok yang menggunakan petunjuk instruksi lain, dan itu benar-benar indah. Hexagony memiliki 6 - masing-masing dimulai dari sudut yang berbeda di sepanjang tepi searah jarum jam, tetapi hanya satu dari mereka yang aktif pada suatu waktu.
Seperti biasa, kita baca bersama ?
. Sekarang ~
adalah negasi unary: itu mengubah 1
a -1
. Selanjutnya, kita tekan tombol #
. Ini adalah salah satu cara untuk beralih di antara IP: dibutuhkan nilai edge modulo 6 saat ini dan beralih ke IP yang sesuai (IP diberi nomor dari 0
arah searah jarum jam). Jadi jika inputnya adalah 0
, maka IP tetap sama, dan berjalan membosankan langsung ke depan !@
. Tetapi jika inputnya adalah 1
, maka nilai saat ini adalah -1
yang mana 5 (mod 6)
. Jadi kami beralih ke IP yang dimulai pada sel yang sama (jalur hijau). Sekarang #
adalah no-op dan ?
atur tepi memori 0
. )
peningkatan jadi !
cetak a 1
. Sekarang kita menekan ~
lagi untuk memastikan itu#
masih merupakan no-op (sebagai lawan mengalihkan kami ke IP 1 yang akan menghentikan program). Sangat membingungkan bagaimana semuanya cocok dalam program kecil ini.
Grup 22
Sebagai catatan, ini adalah grup tempat solusi asli saya. Ini juga merupakan grup terbesar, karena no-op dapat berada di dua tempat yang berbeda, dan ada beberapa pilihan untuk perintah aktual (efektif no-op).
Grup 23
Ini adalah grup lain yang menggunakan banyak IP. Sebenarnya yang ini menggunakan 3 IP berbeda. Sudut kanan atas agak berantakan, tapi saya akan mencoba memandu Anda melalui ini:
Jadi, awal yang pernah Anda lihat sebelumnya: <
membelokkan Utara-Timur, ?
membaca input. Sekarang ]
adalah cara lain untuk mengubah antara IP: tangan mengontrol ke IP berikutnya dalam urutan searah jarum jam. Jadi kami beralih kontrol ke jalur pirus yang (saya tahu sulit untuk dilihat) dimulai di sudut Timur Laut menuju Tenggara. Itu segera tercermin oleh <
sehingga membungkus ke sudut Tenggara, pergi ke Barat Laut. Itu juga hits ]
jadi kami beralih ke IP berikutnya . Ini adalah jalan kelabu yang dimulai di sudut Timur, menuju Barat Daya. Ini mencetak input, kemudian membungkus ke sudut Utara-Timur. <
membelokkan jalur ke horizontal, di mana itu tercermin oleh yang lain <
. Sekarang tangan kanan<
bertindak sebagai cabang: jika inputnya adalah 0
, IP bergerak Utara-Timur, dan membungkus ke @
. Jika inputnya adalah 1
, IP bergerak ke !
, membungkus ke kiri-ke <
mana di mana itu tercermin ... sekarang di sudut, itu membungkus kembali ke !
, akan dibelokkan ke kanan <
, tercermin oleh kiri <
dan jalan dimulai lebih...
Cukup berantakan, tapi berantakan indah. :)
Diagram yang dihasilkan dengan Timwi ini menakjubkan HexagonyColorer .