Циклический Левенкин


45

Фон

Как известно большинству постоянных PPCG, - это программа, которая при запуске выдает собственный исходный код; а расстояние Левенштейна между двумя строками - это минимальное количество вставок, удалений и правок, необходимых для преобразования одной строки в другую. В этой задаче мы объединяем две концепции в «levenquine»: программу, которая выводит свой собственный исходный код, но с одним вставленным, удаленным или замененным одним экземпляром другого символа. (Другими словами, расстояние Левенштейна между программой и ее выходом равно 1.)

Задание

Напишите levenquine так, чтобы его вывод был levenquine, вывод этой программы также был levenquine и так далее. Кроме того, в какой-то момент последовательность повторного запуска программы, ее вывода, запуска вывода и т. Д. Должна в конечном итоге вернуться к исходной программе.

Есть еще одно ограничение, которое усложняет задачу: где-то в этом цикле должны быть две разные программы, у которых нет общих символов (другими словами, нет символа, который существует в одной программе, а также существует в другой программе). Поэтому вашей программе придется постепенно преобразовывать себя в другой набор символов и обратно.

Если вы используете язык программирования, который имеет неизбежный шаблон, который требуется в любой программе, которая производит вывод (например, у него есть только один способ написать printоператор, а другие полезные формы вывода отсутствуют), вы можете рассматривать этот шаблон как несуществующий для этой цели. определить, какие символы две программы имеют общее. Однако вы все равно должны считать этот шаблон для определения свойства кода Levenquine.

Разъяснения

  • Каждая из «программ» в цикле может быть либо полной программой, либо функцией. Они не обязательно должны быть одинаковыми, например, некоторые могут быть полными программами, а некоторые - функциями.
  • Не все программы в цикле должны использовать одну и ту же форму вывода. Например, некоторые могут выводить через стандартный вывод, а некоторые могут выводить через стандартную ошибку.
  • Ваши программы будут запускаться без ввода (или на языках, которые требуют ввода, чтобы сделать что-либо вообще, максимально простой ввод).
  • Применяются правильные правила Куайн ; хотя левенквин не является истинным квинем, вы не можете делать ничего, что было бы незаконным при написании правильного квин. В частности, нулевая программа никогда не является допустимым выводом из правильного Левенкина (и, следовательно, не может быть частью вашего цикла).
  • Ограничение Левенквина измеряется в терминах символов, а не байтов (например, êэто один символ, даже если источник кодируется в UTF-8). Ограничение «нет общих символов» также измеряется с точки зрения символов. Условие победы, однако, считается в байтах.

Состояние победы

Пожалуйста, отправьте как минимум следующие три программы из цикла: самая короткая программа (измеряется в байтах); и две программы из цикла, которые не имеют общих символов. Возможно, что два из них одинаковы, и также возможно, что все три различны. Оценка основана на длине в байтах самой короткой программы, причем более короткая - лучше, что делает это своего рода соревнованием по .


Для людей, которые могут видеть удаленные сообщения: сообщение Песочницы было здесь .

Я думаю, что было бы хорошо, чтобы ответы включали продолжительность цикла.
mbomb007

Что если, скажем, язык имеет несколько функций для выполнения вывода, но все они попарно разделяют символы?
Эрджан Йохансен,

2
@ ÖrjanJohansen: Я думаю, я бы не был против того, чтобы просто выбрать один из них и придерживаться его в этом случае. Однако, это возможно неконкурентоспособно; Я хотел, чтобы правило было объективным, потому что в противном случае люди имеют тенденцию пытаться вколоть в него лазейки, и если вы пытаетесь сделать правило слишком сложным, то возникают споры по поводу того, что оно означает.

Может ли это быть немного по-левенски? Как на расстоянии от исходного исходного кода находится 1 байт?
Волшебная урна осьминога

Ответы:


34

Gol> <> , 252 167 байт

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Попробуйте онлайн!

И взаимно отличная ( Проверка ) программа:

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Попробуйте онлайн!

Это главным образом вдохновлено моим ответом на вызов Mutually Exclusive Quines , где слава также перешла к Bubbler's Gol> <> .

Вот программа проверки, которую вы можете запустить. К сожалению, время ожидания истекло, но вы можете посмотреть, как один раздел кода строит другой, а затем скопировать последнюю напечатанную версию и вставить ее во ввод, чтобы продолжить. В конце концов, вы достигнете первой программы, которую вы вставили.

объяснение

Оба раздела кода состоят из двух разделов: фактически исполняемой части и данных, содержащих другой раздел кода. Они оба функционируют практически одинаково:

Они зависят от флага (первый символ кода, либо, 1либо 0). Если флаг установлен, они начнут создавать другой раздел кода, убрав 252-й символ, добавив / вычтя 28из него и добавив его в код.

Например, вот первые две итерации кода после первой программы выше:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

В конце концов, когда он достигает конца текущего раздела, он переворачивает второй символ кода ( <туда >и обратно), чтобы указать на другой раздел.

Вот оба раздела вместе, собирающиеся перейти от выполнения первого раздела к выполнению второго.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Попробуйте онлайн!

Флаги противоположны для каждого раздела, поэтому новый исполняемый раздел начнет удалять другой раздел кода, пока не достигнет своего собственного кода. В этот момент он переворачивает флаг, и цикл повторяется снова.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.