Altıgen , 920 722 271 bayt
Altı farklı tipte meyve halkaları dedin mi? Yani Hexagony buydu yapılmış için.
){r''o{{y\p''b{{g''<.{</"&~"&~"&<_.>/{.\.....~..&.>}<.._...=.>\<=..}.|>'%<}|\.._\..>....\.}.><.|\{{*<.>,<.>/.\}/.>...\'/../==.|....|./".<_>){{<\....._>\'=.|.....>{>)<._\....<..\..=.._/}\~><.|.....>e''\.<.}\{{\|./<../e;*\.@=_.~><.>{}<><;.(~.__..>\._..>'"n{{<>{<...="<.>../
Tamam değildi. Tanrım, kendime ne yaptım?
Bu kod şimdi yan uzunluğu 10 olan altıgen şeklindedir (19'da başladı). Muhtemelen biraz daha golf oynayabilirdi, belki 9 bedene bile olabilir, ama sanırım işim burada bitti. geçiş yolundan bir komut çıkar).
Görünen doğrusallığa rağmen, kod aslında iki boyutludur: Hexagony normal bir altıgene yeniden düzenleyecektir (aynı zamanda geçerli koddur, ancak tüm boşluklar Hexagony'de isteğe bağlıdır). İşte tüm içindeki katlanmamış kod ... peki "güzellik" demek istemiyorum:
) { r ' ' o { { y \
p ' ' b { { g ' ' < .
{ < / " & ~ " & ~ " & <
_ . > / { . \ . . . . . ~
. . & . > } < . . _ . . . =
. > \ < = . . } . | > ' % < }
| \ . . _ \ . . > . . . . \ . }
. > < . | \ { { * < . > , < . > /
. \ } / . > . . . \ ' / . . / = = .
| . . . . | . / " . < _ > ) { { < \ .
. . . . _ > \ ' = . | . . . . . > {
> ) < . _ \ . . . . < . . \ . . =
. . _ / } \ ~ > < . | . . . . .
> e ' ' \ . < . } \ { { \ | .
/ < . . / e ; * \ . @ = _ .
~ > < . > { } < > < ; . (
~ . _ _ . . > \ . _ . .
> ' " n { { < > { < .
. . = " < . > . . /
açıklama
Bu golf versiyonundaki tüm kıvrımlı çalıştırma yollarını açıklamaya bile çalışmayacağım, ancak algoritma ve genel kontrol akışı algoritmayı açıkladıktan sonra gerçekten meraklı için çalışmayı kolaylaştırabilen bu sürümsüz sürümle aynıdır:
) { r ' ' o { { \ / ' ' p { . . .
. . . . . . . . y . b . . . . . . .
. . . . . . . . ' . . { . . . . . . .
. . . . . . . . \ ' g { / . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . > . . . . < . . . . . . . . .
. . . . . . . . . . . . . . > . . ) < . . . . .
. . . . . . . . . . / = { { < . . . . ( . . . . .
. . . . . . . . . . . ; . . . > . . . . . . . . . <
. . . . . . . . . . . . > < . / e ; * \ . . . . . . .
. . . . . . . . . . . . @ . } . > { } < . . | . . . . .
. . . . . / } \ . . . . . . . > < . . . > { < . . . . . .
. . . . . . > < . . . . . . . . . . . . . . . | . . . . . .
. . . . . . . . _ . . > . . \ \ " ' / . . . . . . . . . . . .
. . . . . . \ { { \ . . . > < . . > . . . . \ . . . . . . . . .
. < . . . . . . . * . . . { . > { } n = { { < . . . / { . \ . . |
. > { { ) < . . ' . . . { . \ ' < . . . . . _ . . . > } < . . .
| . . . . > , < . . . e . . . . . . . . . . . . . = . . } . .
. . . . . . . > ' % < . . . . . . . . . . . . . & . . . | .
. . . . _ . . } . . > } } = ~ & " ~ & " ~ & " < . . . . .
. . . \ . . < . . . . . . . . . . . . . . . . } . . . .
. \ . . . . . . . . . . . . . . . . . . . . . . . < .
. . . . | . . . . . . . . . . . . . . . . . . = . .
. . . . . . \ . . . . . . . . . . . . . . . . / .
. . . . . . > . . . . . . . . . . . . . . . . <
. . . . . . . . . . . . . . . . . . . . . . .
_ . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
Dürüst olmak gerekirse, ilk paragrafta sadece yarı şaka yapıyordum. Altı element döngüsüyle uğraştığımız gerçeği aslında çok yardımcı oldu. Hexagony'in bellek modeli, gridin her bir kenarının sıfıra başlatılmış, işaretli bir isteğe bağlı tamsayı içerdiği sonsuz bir altıgen ızgaradır.
Bu programda kullandığım hafızanın yerleşim şemasını aşağıda bulabilirsiniz:
Soldaki uzun düz bit, ra
harfi ile ilişkilendirilmiş, 0 sonlu bir isteğe bağlı boyut dizisi olarak kullanılır . Diğer harfler üzerindeki kesik çizgiler, her biri 60 derece döndürülen aynı yapı tipini temsil eder. Başlangıçta, bellek işaretçisi kuzeye bakan 1 etiketli kenarı işaret eder .
Kodun ilk, doğrusal biti, kenarların iç "yıldızını" harflerin roygbp
yanı sıra, başlangıç kenarını da ayarlayarak 1
, döngünün nerede bittiğini / başladığını ( p
ve arasında r
) bildiğimiz şekilde ayarlar :
){r''o{{y''g{{b''p{
Bundan sonra, 1 olarak etiketlenen kenara döndük .
Şimdi algoritmanın genel fikri şudur:
- Döngüdeki her harf için, STDIN'den gelen harfleri okumaya devam edin ve geçerli harflerden farklıysa, bunları o harfle ilişkilendirilen dizeye ekleyin.
- Şu anda aradığımız mektubu okuduğumuzda,
e
etiketli bir kenarda saklıyoruz . Çünkü döngü tamamlanmadığı sürece, bu karakteri de yemek zorunda kalacağımızı varsaymalıyız. Daha sonra, halkanın etrafında dönerek bir sonraki karaktere geçeceğiz.
- Bu işlemin yarıda kesilmesinin iki yolu vardır:
- Ya biz de döngüyü tamamladık. Bu durumda, biz tüm bu yerine döngüsü boyunca başka hızlı tur yapmak
e
içinde s ? n
s ile kenarları , çünkü şimdi bu döngünün kolyede kalmasını istiyoruz. Sonra baskı koduna geçiyoruz.
- Veya EOF'ye (negatif karakter kodu olarak tanıdığımız) çarptık. Bu durumda, negatif bir değer yazıyoruz ? mevcut karakter kenarı (bu nedenle kolay hem de ayırt olabilir
e
ve n
). Ardından , baskı koduna geçmeden önce 1 kenarı (potansiyel olarak tamamlanmamış bir döngünün kalanını atlamak için) ararız.
- Yazdırma kodu tekrar döngüden geçer: döngüdeki her karakter için, her karakter için bir sayı yazdırırken depolanan dizgiyi siler
e
. Sonra o taşır ? karakterle ilişkilendirilmiş kenar. Olumsuzsa, programı sonlandırırız. Olumluysa, basitçe yazdırır ve bir sonraki karaktere geçeriz. Döngüyü tamamladığımızda 2. adıma geri döneriz.
İlginç olabilecek başka bir şey, isteğe bağlı boyutta dizeleri nasıl uyguladığımdır (çünkü Hexagony'de sınırsız belleği ilk kez kullanıyorum).
Biz hala karakterleri okuyorsanız bir noktada olduğunu hayal r (olduğu gibi biz diyagramı kullanabilmesi) ve bir [0] ve bir 1 zaten bunların her şey kuzey batısında hala sıfırdır (karakterlerle doldurulmuş ). Örneğin og
, girişin ilk iki karakterini bu kenarlara okuduk ve şimdi a y
.
Yeni bir karakter haline okunur içinde kenarına. Kullanıyoruz mu? Kenar bu karakter eşit olup olmadığını kontrol etmek için r
. (Burada çok güzel bir numara var: Altıgen sadece pozitif ve pozitif olmayanları kolayca ayırt edebilir, bu yüzden eşitliği çıkarma yoluyla kontrol etmek can sıkıcıdır ve en az iki dal gerektirir. değerleri, sadece eşit olduklarında sıfıra verecek olan modulo alarak karşılaştırabiliriz.)
Çünkü y
farklıdır r
, biz sol (işaretsiz) ile kenar hareket içinde ve kopyalama y
orada. Elimizdeki kadar biz şimdi, daha da her zaman karakter bir kenara kopyalama, altıgen etrafında daha fazla hareket y
kenarı karşısındaki üzerinde de . Ama şimdi [0] da zaten üzerine yazmak istemediğimiz bir karakter var . Bunun yerine, "sürükleme" y
ve bir sonraki altıgen etrafında kontrol bir 1 . Ama orada da bir karakter var, bu yüzden başka bir altıgen çizeriz. Şimdi bir [2] hala sıfır, bu yüzden kopyalarızy
bunun içine. Bellek işaretçisi şimdi tel boyunca geriye doğru iç halkaya doğru hareket eder. Arasında (etiketsiz) kenarları, çünkü biz dize başlangıcını ulaştınız zaman bilmek [i] a oysa tüm sıfırdır ? olumlu.
Bu muhtemelen Hexagony'de genel olarak önemsiz olmayan bir kod yazmak için faydalı bir teknik olacaktır.