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