> <> , 56 байт
^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'
Попробуйте онлайн! или проверьте все мутации .
Как работает оригинальная программа (устаревшая)
Переводчик запускается в ячейке (0, 0) . ^устанавливает направление вверх , поэтому указатель инструкции (IP) оборачивается в ячейку (0, 20) .
'активирует строковый режим: пока 'не встретится следующий , все символы под IP помещаются в стек. То же самое 'можно найти снова после обтекания, поэтому мы нажимаем
d3*}^^:84*=?~oao0f.^
IP приземляется в (0, 19) , все еще идя вверх. Исполнительные d3*}толчки 13 = 0xD , а затем 3 , умножает оба значения ( 39 / одинарная кавычка ), а затем поворачивает стек вправо. Это оставляет стек следующим образом.
'd3*}^^:84*=?~oao0f.^
Следующие две инструкции ( ^) ничего не делают на этом этапе.
:84*=дублирует вершину стека, сдвигает 8 и 4 , умножает их ( 32 / пробел ), затем проверяет дублированный символ на равенство с пробелом . Для неизмененной программы это всегда будет 0 .
?пропускает следующую инструкцию, если вершина стека ложная. Для оригинальной программы это всегда так, поэтому ~всегда пропускается.
oaoвыскакивает и печатает верхнюю часть стека, нажимает 10 / перевод строки , затем выталкивает и печатает перевод строки .
Наконец, 0f.переходит к ячейке (0, 15) (самый нижний ^), начиная со следующего символа в стеке.
Как только стек пуст, весь исходный код был напечатан. :потерпит неудачу и программа выйдет.
Как работают мутированные программы (устаревшие)
Дублирование любого символа, не являющегося переводом строки, приведет к расширению программы только по горизонтали. Поскольку программа выполняется вертикально, эти дополнительные инструкции никогда не будут выполнены.
Дублирование любого перевода строки до самого нижнего ^сместит ячейки (0, 14) и (0, 15) в (0, 15) и (0, 16) . 0f.теперь перейдет к ячейке до самого нижнего ^, что также является ^, так что сдвиг не влияет на программу.
Наконец, любой дублированный символ перевода строки также изменит строку. Короткие строки дополняются пробелами, поэтому в позицию перевода строки вставляется пробел 32 / . будет нажимать 1 для пробела, поэтому не пропускает следующую инструкцию. В этом случае появляется и сбрасывается пробел , поэтому следующий текст вместо этого будет печатать над пробелом .84*=?~o
0и00в CJam оба вывода0.