> <> , 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
.