Bu son derece eğlenceliydi. Bu mücadeleyi gönderdiğiniz için teşekkür ederiz.
Tam açıklama: Bu zorluğun yayınlandığı tarihte dil (Hexagony) mevcut değildi. Bununla birlikte, onu icat etmedim ve dil bu zorluk için (ya da başka herhangi bir özel zorluk için) tasarlanmadı.
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
Altıgen olarak yerleştirilmiş:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
Program aslında #
talimatı kullanmıyor, bu yüzden hangi hücrelerin kullanılmadığını göstermek için bu karakteri kullandım.
Bu program nasıl çalışır? Bu bağlıdır. Kısa versiyonunu mu yoksa uzun mu istiyorsun?
Kısa açıklama
Aşağıdaki açıklamada "hat" ve "bölüm" ile ne demek istediğimi göstermek için, amaçlanan çıktının bu diseksiyonu düşünün:
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
Açıklanan, program aşağıdaki sözde koduna karşılık gelir:
n = get integer from stdin
# Calculate the number of lines we need to output.
line = pow(2, n+1)
while line > 0:
line = line - 1
# For all segments except the last, the character to use is spaces.
ch = ' ' (space, ASCII 32)
# The number of segments in each line is
# equal to the line number, counting down.
seg = line
while seg > 0:
seg = seg - 1
# For the last segment, use x’s.
if seg = 0:
ch = 'x' (ASCII 120)
# Calculate the actual segment number, where the leftmost is 1
n = line - seg
# Output the segment
i = pow(3, number of times n can be divided by 2)
i times: output ch
output '\n' (newline, ASCII 10)
end program
Uzun açıklama
Lütfen bu renk kodlu kod yolu şemasına bakın.
İşlem sol üst köşede başlar. Talimatların sırası oldukça sarsılmış bir yol izleyerek ){2'"''3''"2}?)
(artı birkaç gereksiz iptali, "{
vb.) Gerçekleştirilir . Koyu kırmızı renkle vurgulanmış olan İşaretçi No. 0 ile başlıyoruz. Yarıda, sağ üst köşeden başlayıp orman yeşili renkle boyanmış olarak # 1'e geçiyoruz. IP # 2 peygamber çiçeği mavisi (orta sağda) ile başladığında, hafıza düzeni şu şekildedir:
Tüm program boyunca, 2a ve 2b etiketli kenarlar her zaman değere sahip olacaktır 2
(bunları sırasıyla 2 by hesaplamak ve 2'ye bölmek için kullanırız) ve 3 etiketli kenar her zaman 3
(3ⁱ hesaplamak için kullanırız) olacaktır.
Peygamber Çiçeği mavisi ile vurgulanan ilk döngümüze girerken işe başlıyoruz. Bu döngü (}*{=&}{=
2ⁿ⁺¹ değerini hesaplamak için talimatları yürütür . Döngüden çıktığında, eyer kahverengii yolu izlenir ve bu bizi Talimat İşaretçisi # 3'e götürür. Bu IP yalnızca alt kenarı boyunca batıya doğru altıncı sarı sarıya bakar ve kısa süre sonra kontrolü IP # 4'e geçirir.
Fuşya yolu, sol alttan başlayarak IP # 4'ün hızlı bir şekilde azalan çizgiye doğru ilerlediğini , ch32
(boşluk karakteri) ve seg'ı (yeni değer) satırının nasıl ayarlanacağını gösterir . Gerçekte 2ⁿ⁺¹ − 1 ile başladığımız ve sonunda 0 değerinde son bir yineleme yaşadığımızdan önceki azalmadan kaynaklanıyor. Sonra ilk iç içe döngüye giriyoruz .
Biz kısa bir eksiltme sonra, dallanma çivit, yöneltebileceğiz seg , gördüğümüz ch güncellendi x
yalnızca seg şimdi sıfırdır. Daha sonra, içinde bulunduğumuz segmentin gerçek sayısını belirlemek için n - line segmente ayarlanır . Hemen bu sefer domatesin renginde başka bir döngüye gireriz.
Burada, kaç kez n'in (mevcut segment numarası) 2'ye bölünebileceğini anlarız. Modulo bize sıfırı verdiği sürece, i'yi artırır ve n'yi 2'ye böleriz. Memnun olduğumuzda n artık böylesi bölünemez ilk olarak gücü 3 ila yükseltir:, iki döngü içeren gri, içine dal i biz hesaplanır ve daha sonra çıkış olarak ch birçok kez. Bu döngülerden ilki bir[
Kumandayı IP # 3'e geçiren komut - daha önce alt kenarı boyunca sadece bebek adımlarını atıyordu. Döngünün gövdesi (3 ile çarpma ve azaltma), kodun alt kenarı boyunca bitmeyen koyu zeytin yeşili bir çevrede hapsedilen yalnız bir IP # 3 tarafından yürütülür. Benzer şekilde, bu kayrak gri halkalarının ikincisi, burada koyu Hint kırmızısı ile gösterilen ch ve azalmayı göstermek ]
için IP # 5'i aktive eden bir talimat içerir . Her iki durumda da, serviste hapsolmuş olan Talimat İşaretçileri, bir seferde bir kez yineleme gerçekleştirir ve yalnızca hizmetlerinin bir kez daha çağrılacağı zamanı ısırmak için IP # 4'e geri dönüş kontrolü sağlar. Bu arada, kayrak grisi fuşyası ve indigo kardeşleriyle birleşiyor.
As seg kaçınılmaz sıfıra ulaştığında, sadece derhal satır karakteri verir ve çim yeşil yolu, içine çivit döngüden çıkılır devam etmek için geri fuşya içine birleştirir hat döngü. Hat döngüsünün son yinelemesinin ötesinde, nihai program sonlandırmasının kısa samurlu ebon yolu yer alır.
(,],~3^#@~.)@]
içinde(1,[:,1,"0~3*])
1 bayt yerine tasarruf sağlar. Ve ile Tamam!
çıkış karakter olaraku:32+
yerine' #'{~
başka bir tasarruf sağlar.