Bu şaşırtıcı derecede zordu, ve optimal olduğuna ikna olmadım ...
<.@!$?
Kodu doldurup açtıktan sonra bu, aşağıdaki onaltılık ızgarayı temsil eder:
Bu, anti-diyagonal boyunca hareket eden son hatasız kedi programım gibi benzer bir kontrol akışını kullanıyor . Bunu başarmak için, mor işaretçinin sol alt köşeye dolandığı yön gösterici işaretçiyi (IP) sola döndürerek başlıyoruz.
?
girişi bir tamsayı olarak okur. !
geri yazdırır. .
sadece bir ameliyat değil. Şimdi ızgaranın köşesi dal olarak hareket eder:
Girdi, 0
IP ise, sadece programı sonlandıran kırmızı yol boyunca devam edecektir @
.
Giriş yapıldıysa, 1
IP yeşil yolda devam edecektir. Yine, .
sadece no-op, ama $
Befunge'nin trambolininin eşdeğeri: bir sonraki talimatı atlıyor. Kaydırma işleminden sonra, bir sonraki komut olacaktır ?
, ancak uygulama nedeniyle $
aslında mavi yol üzerinde devam eder, !
başka bir kopyasını basmakla başlar 1
. Sadece içerdiği bu döngü !..$
şimdi süresiz olarak tekrarlanır.
Hexagony'de kontrol akışının incelenmesi ...
Yukarıdaki çözümün optimal olduğuna inanıyorum. Her biri en az birini içeren 6 baytlık Hexagony programlarını kontrol eden kaba bir forcer yazdım ?!@
(zorunludur; aynı zamanda , sıfıra bölünme hatasıyla sonlandırmak için kontrol ettik :
ve %
yerine koyuldum) @
Bu da yardımcı olmadı). Onay baskılar a) üreten tüm programlar 0
girişi 0
ve sona erdirmek ve b) en az iki üretmek 1
ler (ve başka bir şey) ve yok (programın ilk 60 kene içinde sona 200 keneler 5 bayt çözeltiler için) . Herhangi bir geçerli çözümün, ilkini 0
veya ikincisini 1
böylesine küçük bir ızgaraya doğru şekilde basması için 200'den fazla tik alacağından şüpheliyim , bu yüzden herhangi bir olası çözümü kaçırdığımı sanmıyorum.
Arama işlemi 5 bayt için sonuç vermedi, ancak 6 bayt için 57 sonuç elde edildi (kullanarak @
; bunu aynı miktarda baytta temiz bir şekilde çözebiliyorsak, hatayla sonlandırmamız gerekmez). Bu 57 kişiden sadece 6'sı, aslında sadece iki 1
saniyeyi basan ve daha fazlasını basmadan sonsuz bir döngüye giren yanlış pozitiflerdi . Bir çözüm iki !
komut içermekteydi çünkü iki komut içeriyordu . Bu tam olarak 50 geçerli çözüm bırakıyor.
Bir veya iki karakterin önemli olmadığı çözümler arasında belirli bir yozlaşma söz konusudur, örneğin, zaten etkili bir şekilde çalışamamaları. Çözümler, 23 farklı gerçek program grubuna ayrılabilir (bazı durumlarda, iki küme arasında yalnızca tek bir karakter farkı vardır, ancak kontrol akışını büyük ölçüde değiştirir, bu yüzden ayrı ayrı saydım). Gruplardan ikisi, çok yönlü komut işaretleyicilerini çok beklenmedik bir şekilde kullanıyor. Dalları ve aynaları kullanmak için bu yolların çoğunu asla bulamamış olduğum için, Hexagony'de ne tür kontrol akışının mümkün olabileceği konusunda çok ilginç bir çalışma yapıyorlar ve kesinlikle gelecekteki golf sahaları için bazı yeni püf noktaları öğrendim.
Genel kontrol akış hemen hemen her zaman aynıdır: bir sayı okumak, yazdırmak. E? Er 0
için bir yol bulmak @
döngü devam değilse, !
bir kenar değerini mainting süre 1
. Dört önemli istisna vardır:
- Bir çözüm (iki çözüm
!
) 1
, yineleme başına iki saniyeyi yazdırır , bu nedenle programların çoğunluğunun iki katı kadar hızlı yazdırır. Bunu x2
aşağıda ile işaretledim .
- Birkaç çözümler (bir içerenler
o
) değiştirin 1
bir ile 111
(karakter kodunun o
), bu yüzden baskı üç 1
onları programlarının çoğunda olduğu kadar hızlı üç kere basmak yapım yineleme başına s. Bunları x3
aşağıda ile işaretledim .
- İki çözelti ekleme , bir
1
her tekrarında kenar değerine (böylece 1
-> 11
-> 111
-> ...). Bunlar çok hızlı yazdırılıyor , ancak sonunda hafızası tükenecek. Bunları OoM
aşağıda ile işaretledim .
- İki çözüm, sadece ileri geri sıçrayan
!
, her keneye (her 5. ya da öylesine yerine) baskı yapan ve bunları biraz daha hızlı (ve daha düzenli) yapan çok sıkı bir döngüye girer . Bunları ><
aşağıda ile işaretledim .
Yani burada tüm hayvanat bahçesi:
#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
Aşağıdaki, daha fazla temsili gruptan bir avuç için kısa bir adım. Özellikle 10 ve 23 numaralı gruplar kontrol etmeye değer. Diğer gruplarda birçok ilginç ve bazen karmaşık yollar var, ancak bunun sonunda sizi yeterince sıktığımı düşünüyorum. Gerçekten Hexagony'i öğrenmek isteyen herkes için, aynaların daha da muhtemel kullanımlarını sergiledikleri için bunlar kesinlikle araştırmaya değer $
.
Grup 1
Bu benim orijinal çözümümden daha ayrıntılı değil, ama yollar farklı yönlere gidiyor. Aynı zamanda, tek bir hücrede en fazla sayıda varyasyona izin verir, çünkü en sağdaki no op, yapısını değiştirmeden hala geçerli kılan 5 farklı komutla değiştirilebilir:
2. Grup
Bu oldukça ilginç, çünkü sadece yatay hareket ediyor. İçin sarma sonra >
, IP köşesinde dalı alarak, derhal tersine çevirir. Şema tamamen gözle görülebilir bir şekilde görünmüyor, fakat durumda 1
ilk satırı tekrar geçiyoruz, fakat bu sefer geriye doğru. Bu aynı zamanda ?
, şimdi geri dönen 0
(EOF) , tekrar karşılaştığımız anlamına gelir . Bu, )
yazdırmayı sürdürmek için (artış) ile sabitlenir 1
. Bu aynı zamanda, 5 varyasyonları vardır )
da olabilir 1
ya da o
ve >
aynı zamanda olabilir |
:
Grup 3
Bu bir öncekiyle neredeyse aynı görünüyor ama cehennem gibi dağınık. Vuruşa |
ve sonra alt ya da üst sıraya hareket etmek aynıdır. Fakat bir döngü durumunda, $
şimdi aynanın )
üstüne atlar . Böylece turkuaz yolu sağa doğru izliyoruz, şimdi artmaya çarpıyoruz, tekrar tekrar@
sarılmadan önce üstünden atlıyoruz ve sonra tepedeki yeşil yola geri dönüyoruz.|
4. Grup
Bunun özellikle şık olduğunu düşündüm:
_
Sağ üst köşede ayna başlangıçta no-op, bu yüzden yazdırmak !
ve vurmak <
. 0
Yolu şimdi yatay ayna vurur ve sonlandırır. 1
Sarar, aşağı eğilir: yol olsa gerçekten ilginç bir yörünge alır !
yatay doğru yönlendirildi ve daha sonra geri sarar !
tekrar . Daha sonra bu eşkenar dörtgen şeklinde hareket etmeye devam eder, her yineleme için iki kez basar (her üç tıklatma).
8. Grup
Bu gerçekten sıkı bir baskı döngüsüne sahip iki çözümden biridir:
<
Dalı olarak görür. İki kez sardıktan sonra, 0
vurur @
. 1
Öte yandan, önce atlar ?
sonra tekrar >
üzerine gönderir $
, böylece atlar @
. Daha sonra IP ileri ve geri arasında sıçrar turkuaz yolu içine kaydırılır >
ve <
(ara kenarında ambalaj).
Grup 10
Başka komut işaretçisi kullanan iki gruptan biri ve kesinlikle çok güzel. Hexagony 6'ya sahiptir - her biri saat yönünde olan kenardan farklı bir köşeden başlar, ancak bir anda sadece biri aktif durumdadır.
Her zamanki gibi okuduk ?
. Şimdi ~
sıradışı olumsuzlama: 1
a dönüşür -1
. Sonra, biz vurduk #
. Bu IP'ler arasında geçiş yapmanın bir yoludur: modulo 6'nın geçerli kenar değerini alır ve karşılık gelen IP'ye geçer (IP'ler 0
saat yönünde numaralandırılır ). Yani eğer girdiyse, 0
IP basitçe aynı kalır ve dümdüz ileri doğru ilerler !@
. Giriş Ama eğer 1
, o zaman şimdiki değeridir -1
olan 5 (mod 6)
. Böylece aynı hücrede başlayan (yeşil yol) IP'ye geçiyoruz. Şimdi #
bir op-op ve ?
hafıza kenarını ayarlar 0
. )
artımlar !
a 1
. Şimdi bunu ~
sağlamak için tekrar vurduk#
hala bir operasyon dışıdır (programı sonlandıracak olan IP 1'e geçmek yerine). Bu küçük programda her şeyin birbirine ne kadar iyi uyduğuna şaşırıyor.
Grup 22
Sadece not etmek gerekirse, bu benim orjinal çözümümün içinde bulunduğu gruptur. Aynı zamanda en büyük grup olur çünkü no-op iki farklı yerde olabilir ve gerçek (etkili no-op) komutu için birkaç seçenek vardır.
Grup 23
Bu, çoklu IP kullanan diğer gruptur. Aslında bu, 3 farklı IP kullanıyor . Sağ üst köşe biraz dağınıklık, ancak size bu konuda yürümeye çalışacağım:
Böylece, daha önce gördüğünüz başlangıç: <
Kuzey-Doğu'yı saptırıyor, ?
girdiyi okuyor. Şimdi ]
IP'ler arasında geçiş yapmanın başka bir yolu: saat yönünde sırayla kontrolü bir sonraki IP'ye veriyor. Bu yüzden kontrolü biz (görmek zor biliyorum) Güney-Doğu'ya doğru giden Kuzey-Doğu köşesinde başlayan turkuaz patikaya geçiriyoruz. Hemen <
Güney-Doğu köşesine dolanan Kuzey-Batı'ya kayıyor. Aynı zamanda vurur ]
yüzden geçiş sonraki IP. Bu Doğu köşesinde başlayan ve Güneybatıya giden gri yol. Girdiyi yazdırır, ardından Kuzeydoğu köşesine kaydırır. <
yolu, diğeri tarafından yansıdığı yatay olarak saptırır <
. Şimdi sağ<
şube görevi görür: girdiyse, 0
IP Kuzey-Doğu'ya hareket eder ve @
. Girdi olsaydı, 1
IP moves ye hareket eder , yansıdığı yerde !
sola sarılır <
... şimdi köşede, tekrar sarar !
, sağ tarafından saptırılır <
, sola yansıtılır <
ve yollar başlar bitmiş...
Oldukça karışıklık, ama güzel bir karışıklık. :)
İle oluşturulan Diyagramlar Timwi en şaşırtıcı HexagonyColorer .