Сделай лозу, но с изюминкой.
утверждение
Куайн печатает свой код, но в конце ставит свой первый символ.
(Вы можете сделать это в обратном порядке, но включите эту заметку в свой ответ).
Затем на выходе должна быть программа, которая также является решением.
Пример: предположим, что ваш код был foobar
, его выполнение вернет, oobarf
что будет другой допустимой программой
foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar
правила
- Ваш код не должен быть результатом какого-то поколения чужого кода, который, очевидно, ворует
- Ваш код должен быть длиной более 2 символов (поэтому короткий код неинтересен)
- Ваш код должен содержать как минимум два разных символа (например,
+++
недействительно)
счет
Как вызов гольф -кода, выигрывает самый короткий код.
Ответы:
Befunge-98 (PyFunge) , 2600 байт
Попробуйте онлайн!
Это делает это был адский праздник.
Как это работает:
Программа представляет собой набор операторов put, который собирает вокруг себя Программу B, которая затем печатает половину исходного байта, сдвинутого дважды.
Программа на самом деле представляет собой 2 копии 1300-байтовой программы, так что гарантируется, что вся 1300-байтовая программа всегда запускается целиком.
Лучшее объяснение:
Каждый Befunge-98 Куайн должно содержать символы таких
@
илиq
и,
Problem : Ни один из этих символов не являются хорошей отправной точкой Especialy , так
@
иq
завершать работу программы мгновенно.Решение : избавиться от этих символов в исходном коде
Проблема : как?
Решение : используйте
p
(вставьте) команды, чтобы изменить исходный код, включив в него необходимые символы, которые будут печатать содержимое исходного кода, сдвинутого на один байт, и не использоватьg
команду, которая обманывает.Проблема : (вздохните, когда они закончатся)
Команда put выдает 3 значения,
n x y
которые определяют символ, x-координату, y-координату, однако, когда инициализация этих значений делится пополам, она может записывать неверные символы в исходном коде, что делает ее бесполезной для quining.Решение : (последний, который я обещаю)
Используйте 2 копии исходного кода, причем последний является «правильным», это случайно решает другую проблему, заключающуюся в том, что оператор put (команда p + инициализаторы констант), разделенный пополам, не выполняется, это исправлено наличием 2 копий каждого оператора. Последнее, что нужно для работы, это как сделать весь исходный код из половины?
Ответ :
Это наглядное доказательство того, почему две копии строки сдвинуты в байтах == Две копии строки сдвинуты в байтах. Это означает, что мы можем взять половину кода, сдвинуть его по байтам, а затем распечатать дважды (ИЛИ взять половину кода, сдвинуть его по байтам, напечатать, повторить [Вот что на самом деле происходит])
Как это реализовано : Предположим, 0123456789abcdef является источником
Псевдокод Befunge:
PS означает Print Stack (не настоящая инструкция). Мы помещаем половину исходного кода обратно в стек, используя
""
затем мы печатаем стек и затем выбираем ('
команду) первый символ,0
который мы перемещаем перед,'
и печатаем его последним, что вызывает сдвиг байтов, затем мы повторяем цикл еще раз, чтобы напечатать второй экземпляр. Одна техническая проблема, с которой нужно иметь дело - это символы внутри исходного кода, это может вызвать проблемы, если мы напишем его во время выполнения исходного кода, я обошел это, добавив больше выражений put, которые позаботятся об этом внешне.Это заставляет код выглядеть примерно так:
Объяснение :
Зеленая подсветка: код, который заботится о добавлении символов в исходный
текст. Серые буквы (из-за плохой видимости, извините): код, который добавляется зеленым кодом.
Красная подсветка: код, который перемещает первый символ второй половины исходного кода в синюю область. ,
Синяя подсветка: см. Красная подсветка
Оранжевая подсветка: код, который гарантирует, что мы завершим работу после того, как мы записали 2-байтовые смещенные копии, поместив
@
команду (завершение) в желтую область.Надеемся, что стрелки должны прояснить, как проходит поток кода.
Вот последняя трудная часть:
откуда взялся исходный код
детей?Краткий ответ: C # Magic
Длинный ответ: 100+ фрагментов кода Befunge, сделанных вручную, скомпилированных кодом C #. Я вручную написал около 100 константных инициализаторов (фрагмент кода befunge, который помещает определенное число в стек) вручную, а затем использовал специальную программу на C # для компиляции ее в 1300-байтовый вывод Befunge, который я затем скопировал, вставил дважды и сделал финальный программа.
Ты все еще здесь? Большое спасибо за чтение! (или хотя бы прокрутить до конца)
Надеюсь, мои плохие шутки были веселыми и не раздражающими.
Примечание. В этом коде оператор put не создает команду ag, которая будет обманывать.
РЕДАКТИРОВАТЬ: я проверил код, используя следующий код Javascript в TIO, используя инструменты разработчика
источник
p
с неверными аргументами гениальна.