Фон
Как известно большинству постоянных PPCG, quine - это программа, которая при запуске выдает собственный исходный код; а расстояние Левенштейна между двумя строками - это минимальное количество вставок, удалений и правок, необходимых для преобразования одной строки в другую. В этой задаче мы объединяем две концепции в «levenquine»: программу, которая выводит свой собственный исходный код, но с одним вставленным, удаленным или замененным одним экземпляром другого символа. (Другими словами, расстояние Левенштейна между программой и ее выходом равно 1.)
Задание
Напишите levenquine так, чтобы его вывод был levenquine, вывод этой программы также был levenquine и так далее. Кроме того, в какой-то момент последовательность повторного запуска программы, ее вывода, запуска вывода и т. Д. Должна в конечном итоге вернуться к исходной программе.
Есть еще одно ограничение, которое усложняет задачу: где-то в этом цикле должны быть две разные программы, у которых нет общих символов (другими словами, нет символа, который существует в одной программе, а также существует в другой программе). Поэтому вашей программе придется постепенно преобразовывать себя в другой набор символов и обратно.
Если вы используете язык программирования, который имеет неизбежный шаблон, который требуется в любой программе, которая производит вывод (например, у него есть только один способ написать print
оператор, а другие полезные формы вывода отсутствуют), вы можете рассматривать этот шаблон как несуществующий для этой цели. определить, какие символы две программы имеют общее. Однако вы все равно должны считать этот шаблон для определения свойства кода Levenquine.
Разъяснения
- Каждая из «программ» в цикле может быть либо полной программой, либо функцией. Они не обязательно должны быть одинаковыми, например, некоторые могут быть полными программами, а некоторые - функциями.
- Не все программы в цикле должны использовать одну и ту же форму вывода. Например, некоторые могут выводить через стандартный вывод, а некоторые могут выводить через стандартную ошибку.
- Ваши программы будут запускаться без ввода (или на языках, которые требуют ввода, чтобы сделать что-либо вообще, максимально простой ввод).
- Применяются правильные правила Куайн ; хотя левенквин не является истинным квинем, вы не можете делать ничего, что было бы незаконным при написании правильного квин. В частности, нулевая программа никогда не является допустимым выводом из правильного Левенкина (и, следовательно, не может быть частью вашего цикла).
- Ограничение Левенквина измеряется в терминах символов, а не байтов (например,
ê
это один символ, даже если источник кодируется в UTF-8). Ограничение «нет общих символов» также измеряется с точки зрения символов. Условие победы, однако, считается в байтах.
Состояние победы
Пожалуйста, отправьте как минимум следующие три программы из цикла: самая короткая программа (измеряется в байтах); и две программы из цикла, которые не имеют общих символов. Возможно, что два из них одинаковы, и также возможно, что все три различны. Оценка основана на длине в байтах самой короткой программы, причем более короткая - лучше, что делает это своего рода соревнованием по коду-гольфу .
Ответы:
Gol> <> ,
252167 байтПопробуйте онлайн!
И взаимно отличная ( Проверка ) программа:
Попробуйте онлайн!
Это главным образом вдохновлено моим ответом на вызов Mutually Exclusive Quines , где слава также перешла к Bubbler's Gol> <> .
Вот программа проверки, которую вы можете запустить. К сожалению, время ожидания истекло, но вы можете посмотреть, как один раздел кода строит другой, а затем скопировать последнюю напечатанную версию и вставить ее во ввод, чтобы продолжить. В конце концов, вы достигнете первой программы, которую вы вставили.
объяснение
Оба раздела кода состоят из двух разделов: фактически исполняемой части и данных, содержащих другой раздел кода. Они оба функционируют практически одинаково:
Они зависят от флага (первый символ кода, либо,
1
либо0
). Если флаг установлен, они начнут создавать другой раздел кода, убрав 252-й символ, добавив / вычтя28
из него и добавив его в код.Например, вот первые две итерации кода после первой программы выше:
В конце концов, когда он достигает конца текущего раздела, он переворачивает второй символ кода (
<
туда>
и обратно), чтобы указать на другой раздел.Вот оба раздела вместе, собирающиеся перейти от выполнения первого раздела к выполнению второго.
Попробуйте онлайн!
Флаги противоположны для каждого раздела, поэтому новый исполняемый раздел начнет удалять другой раздел кода, пока не достигнет своего собственного кода. В этот момент он переворачивает флаг, и цикл повторяется снова.
источник