Це було надзвичайно весело. Дякуємо, що опублікували цей виклик.
Повне розкриття: мови (Гексагонія) не існувало під час опублікування цього виклику. Однак я цього не вигадав, і мова не була розроблена для цього виклику (або будь-якого іншого конкретного виклику).
){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_
Викладені гексагонально:
) { _ 2 " _ { \ "
{ { " " } " { ' 2 /
/ _ . \ > < * \ " \ /
_ > < [ \ ] / 3 \ ' \ _
; | # _ _ / ( \ 2 \ ' 3 _
' } ( # : | { $ # { > _ \ /
/ ( # = { / ; 0 1 * & " \ \ _
| [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
/ ~ - = " { } < _ " = # / \ } .
> " % < . { # { x \ " < # _ /
= & { . / 1 # _ # > _ _ < _
' \ / " # | @ _ | / { = /
' | \ " " . { / > } ] #
] > ( _ < \ ' { \ & #
| > = & { { ( \ = /
\ { * ' " ] < $ _
Програма насправді не використовує #
інструкцію, тому я використав цей символ, щоб показати, які клітини справді не використовуються.
Як працює ця програма? Це залежить. Хочеш короткий варіант чи довгий?
Коротке пояснення
Щоб проілюструвати, що я маю на увазі під "рядком" та "сегментом" у наступному поясненні, розглянемо це розсічення передбачуваного виводу:
segments →
│ │ │ │ │ │x lines
─┼───┼─┼─────────┼─┼───┼─ ↓
│ │ │ │ │xxx│
─┼───┼─┼─────────┼─┼───┘
│ │ │ │x│
─┼───┼─┼─────────┼─┘
│ │ │xxxxxxxxx│
─┼───┼─┼─────────┘
│ │x│
─┼───┼─┘
│xxx│
─┼───┘
x│
З урахуванням цього, програма відповідає наступному псевдокоду:
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
Довге пояснення
Будь ласка, зверніться до цієї кольорової схеми кодового шляху.
Виконання починається у верхньому лівому куті. Послідовність інструкцій ){2'"''3''"2}?)
виконується (плюс кілька зайвих скасувань, як "{
і т. Д.), Переслідуючи досить складний шлях. Почнемо з вказівника № 0, виділеного малиновим кольором. На півдорозі ми переходимо до №1, починаючи з правого верхнього кута і пофарбованого в лісовий зелений колір. Коли IP №2 починається у волошки синього кольору (середній правий), макет пам'яті такий:
Протягом усієї програми краї, позначені 2a та 2b , завжди матимуть значення 2
(ми використовуємо їх для обчислення 2ⁿ⁺¹ та ділення на 2 відповідно), а край, позначений 3 , завжди буде 3
(ми використовуємо це для обчислення 3ⁱ).
Ми приступаємо до бізнесу, коли входимо в наш перший цикл, виділений волошково-синім кольором. Цей цикл виконує вказівки (}*{=&}{=
для обчислення значення 2ⁿ⁺¹. Коли цикл виходить, проходить коричневий шлях сідла, який веде нас до вказівника №3. Ця IP-адреса просто кидається вниз по нижньому краю на захід золотисто-жовтим кольором і незабаром передає контроль IP-4.
Шлях фуксії указует на те, як IP - # 4, починаючи в нижньому лівому кутку , протікає швидко , щоб декремент лінію , встановлену ч до 32
(символу пробілу) і SEG до (новому значенням) лінії . Через раннє зменшення ми фактично починаємо з 2ⁿ⁺¹ − 1 і врешті-решт відчуваємо останню ітерацію зі значенням 0. Потім вводимо перший вкладений цикл.
Звернемо свою увагу на розгалужене індиго, де після короткого декрету о SEG , ми бачимо , ч оновлена x
тільки якщо сегментний тепер дорівнює нулю. Після цього n встановлюється рядок - seg, щоб визначити фактичну кількість сегмента, в якому ми знаходимося. Одразу вводимо ще одну петлю, цього разу в яскравому кольорі помідора.
Тут ми з'ясуємо, скільки разів n (поточний номер сегмента) можна розділити на 2. Поки модуль дає нам нуль, ми збільшуємо i і ділимо n на 2. Коли ми задоволені, n більше не є таким чином дільним ми розширитися в сірий шифер, який містить дві петлі: спочатку вона піднімає 3 до сили I ми вирахували, а потім виводить сп , що у багато разів. Зауважте, що перша з цих циклів містить a[
інструкція, яка перемикає контроль на IP №3 - та, яка раніше робила лише кроки дитини по нижньому краю. Тіло петлі (множення на 3 і декрементація) виконується самотнім IP №3, ув'язненим у нескінченний темно-оливковий зелений цикл уздовж нижнього краю коду. Аналогічно, друга з цих шиферних сірих петель містить ]
інструкцію, яка активує IP №5 для виведення ch і зменшення, показані тут темно-індійським червоним кольором. В обох випадках ці покажчики Інструкції, захоплені сервітутом, слухняно виконують по одній ітерації за один раз і повертають контроль до IP # 4, лише щоб запропонувати момент, коли їх послуга знову буде викликана. Тим часом сірий шифер знову приєднується до своїх братів Фуксія та Індіго.
Коли seg неминуче досягає нуля, петля індиго виходить на газонний зелений шлях, який просто виводить символ нового рядка і негайно зливається назад у фуксію, щоб продовжити цикл лінії . Поза остаточною ітерацією лінії контуру лежить короткий соболий Ebon шлях кінцевого завершення програми.
(,],~3^#@~.)@]
замість цього(1,[:,1,"0~3*])
зберігається 1 байт. І якщо ви все в порядку з!
як вихідний графік,u:32+
а не' #'{~
зберігаєте ще один.