Это было очень весело. Спасибо за публикацию этого вызова.
Полное раскрытие: язык (Hexagony) не существовал на момент публикации данного вызова. Тем не менее, я не изобрел его, и язык не был предназначен для этой задачи (или любой другой конкретной задачи).
){_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, начиная с нижнего левого угла, быстро переходит к уменьшающей строке , устанавливает ch в 32
(символ пробела) и переходит в (новое значение) строку . Это связано с ранним декрементом, что мы фактически начинаем с 2ⁿ⁺¹ − 1 и в конечном итоге испытываем последнюю итерацию со значением 0. Затем мы входим в первый вложенный цикл.
Мы обратим наше внимание на ветвящееся индиго, где после краткого уменьшения значения seg мы видим, что ch обновляется, x
только если seg теперь равен нулю. После этого n устанавливается на line-seg, чтобы определить фактическое число сегмента, в котором мы находимся. Сразу же мы входим в другой цикл, на этот раз в светлом цвете томата.
Здесь мы выясняем, сколько раз n (текущий номер сегмента) можно разделить на 2. Пока модуль дает нам ноль, мы увеличиваем i и делим n на 2. Когда мы удовлетворены, n больше не делится таким образом , мы разветвляемся на сланцево-серый, который содержит два цикла: сначала он увеличивает значение 3 до степени i, которую мы вычислили, а затем выводит ch много раз. Заметьте, что первый из этих циклов содержит[
инструкция, которая переключает управление на IP # 3 - тот, который раньше делал только шаги по нижнему краю. Тело цикла (умножение на 3 и уменьшение) выполняется одиноким IP # 3, заключенным в бесконечный темно-оливково-зеленый цикл по нижнему краю кода. Точно так же второй из этих сланцевых серых циклов содержит ]
инструкцию, которая активирует IP # 5 для вывода ch и декремента, показанного здесь темно-индийским красным цветом. В обоих случаях эти указатели инструкций, захваченные в сервитуте, послушно выполняют одну итерацию за раз и возвращают управление обратно к IP # 4 только для того, чтобы подождать, пока их служба будет вызвана снова. Серый шифер, тем временем, воссоединяется со своими братьями цвета фуксии и индиго.
Когда seg неизбежно достигает нуля, петля индиго выходит на зеленую дорожку газона, которая просто выводит символ новой строки и быстро сливается обратно в фуксию, чтобы продолжить цикл строки . За последней итерацией цикла строки лежит короткий соболиный путь окончательного завершения программы.
(,],~3^#@~.)@]
вместо(1,[:,1,"0~3*])
сохранения 1 байт. И если вы согласны с!
выводом charu:32+
вместо' #'{~
сохранения другого.