Мутировавшая квина

14

Ваша задача - создать программу, которая печатает свой собственный источник.

«Эй, у нас уже есть этот вызов, и множество его вариантов! Почему вы делаете еще один?» Вы можете спросить, но этот будет одним из самых сложных (надеюсь, в любом случае).

Ваш quine должен быть «защищен от мутаций», что означает, что quine, даже если любой из его символов дублирован на месте, должен выводить исходный код исходной программы.

Например, если у вас есть квайн (следующий пример написан не на каком-либо языке, это просто псевдокод):

abcd

Все эти программы должны выводить abcd:

aabcd
abbcd
abccd
abcdd

(В каждом из этих программ, a, b, cи dкаждый дублируются на месте, а это значит , дублированный характер был помещен непосредственно после первоначального символа.)

Правила:

  • Применяются стандартные правила Quine.
  • Многобайтовый символ считается одним символом, и этот символ не «разбивается» на соответствующие байты при дублировании.

Это , поэтому выигрывает самый короткий код в байтах!

clismique
источник
Это считается? 0и 00в CJam оба вывода 0.
геокавель
Нет, 0это не правильный Квин.
Деннис
2
Я думаю, что это было бы очень интересно, как боулинг
Mr. Xcoder
Решена ли проблема мутации кода в целом? если мутация не произойдет с символом внутри строки в кавычках, это обычно приведет к повреждению программы.
Хазен
Разве название не вводит в заблуждение? «Мутация» предполагает изменение персонажа, а не повторение его
Луис Мендо

Ответы:

18

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

Деннис
источник
Вы можете продублировать любую новую строку, и она все равно будет работать.
Деннис
3
О, я не прочитал сообщение должным образом: P (Черт возьми, Деннис, почему ты так хорош)
clismique
4
Трещины.
jimmy23013
@ jimmy23013 Должно быть исправлено.
Деннис