концепция
Напишите программу, которая выводит код на своем языке программирования. Этот код при выполнении должен выводить оригинальную программу.
правила
- Поскольку это обманщик, вы можете прочитать исходный код.
- Первая программа вывода должна быть на том же языке, что и исходная программа.
- Вы не можете выводить обычную квинну. Две программы должны быть разными.
- Применяются стандартные лазейки.
- Это код-гольф, поэтому выигрывает самый короткий ответ, однако он не будет выбран.
Ответы:
Bash + coreutils, 11 байт
Это печатает
Попробуйте онлайн!
В свою очередь, это печатает
источник
tr
команда перенаправлена на$0
который является собственным исходным кодом. Так что это "обманщик".Улитки, 0 байт
Вторая программа
Первая программа подсчитывает количество совпадений пустого шаблона на пустом входе (который действительно имеет область 0, но шаблон всегда запускается как минимум один раз как хак, чтобы позволить программам решать, что они хотят напечатать на пустом вводе). Вторая программа начинается с квантификатора (как
{1}
в регулярном выражении), который вызывает ошибку разбора. Поскольку программа не выполняет синтаксический анализ, STDOUT является пустой строкой.источник
7 , 2 байта
7 использует 3-битный набор символов, но принимает ввод, упакованный в байты (и согласно мета, языки с суббайтовыми наборами символов подсчитываются с использованием байтов для файла на диске ). Вот
xxd
дамп программы:При передаче этого файла интерпретатору 7 он выведет следующую программу:
который, в свою очередь, снова выведет исходную программу.
Так что здесь происходит? При этом не требуется чтение источника (на самом деле, я не думаю, что можно прочитать источник в 7), хотя, возможно, программа обманывает по-другому; дайте мне знать, что вы думаете. Вот как работает программа. (Обратите внимание, что у каждой из 7 команд есть два варианта, некоторые из которых не имеют имен и не могут отображаться в исходной программе. Всего имеется двенадцать команд в шести парах. Я использую жирный шрифт для активных команд, полужирный для пассивных команды, и в тех случаях, когда активная команда не имеет имени, я даю ей то же имя, что и у соответствующей пассивной команды, и полагаюсь на жирный шрифт, чтобы различать. В случае, когда оба названы, например,
7
который является активным вариантом1
, каждая команда получает свое собственное имя, а жирный шрифт - это просто подсветка синтаксиса.)На этом этапе интерпретатор 7 видит, что вершина стека содержит команды (
2
и3
), которые не могут быть представлены, поэтому он выходит из вершины стека, создавая723
(что есть). Первая команда output выбирает формат вывода; в данном случае это формат 7, «форматировать вывод так же, как и программу». Таким образом, команды упакованы в байты. Затем программа продолжается:На данный момент в стеке нет ничего, кроме пустых элементов стека, поэтому программа завершается. Мы выводим
23
раньше. Если мы убегаем237
(а нам нужно, потому что он содержит непредставимые команды), мы получаем7231
. Он получает выходные данные напрямую, делая окончательный вывод программы237231
(форматируется так же, как программа, то есть упаковывается в байты). Это4fa67f
. (Можно отметить, что это1
было совершенно бессмысленно с точки зрения влияния на результат; единственная причина, по которой это происходит, состоит в том, чтобы сделать две программы разными.)Бег
237231
продолжается почти точно так же; разница в том, что бесполезные1
запускаются сразу после первой печати (и пустой элемент неявно удаляется во второй раз, когда достигается текущий конец программы). Опять же, в231
конечном итоге выводится сам, в23
конечном итоге выводится сам перед ним7
, и мы получаем231723
исходную программу.Наблюдатель может заметить, что две программы, несмотря на одинаковую длину в «нативном» восьмеричном языке, имеют разную длину на диске. Это потому, что 7-ми программа может быть дополнена произвольным числом в 1 бит, а упакованный формат отбрасывает конечный отступ. Вот как происходит кодирование:
Другими словами, двух байтов
4C
F4
достаточно для представления программы, так что это все, что я использовал.источник
Python 3,
297279251243225218208180126111 байтовNon-жульничество:
Это печатает:
который при выполнении печатает оригинальную программу.
источник
Пакетный, 14 байтов
Который при запуске в качестве
cyclicquine.bat
выходовКоторый при запуске выводит оригинальный пакетный файл.
источник
RProgN , 4 байта.
Сообщество, похоже, рассматривает подобные вещи как обманщик , который, таким образом, удовлетворяет критериям.
С завершающим переводом строки.
Это печатает
С завершающей новой строкой, которая печатает первый код.
RProgN печатает выталкивание стека сверху вниз.
Попробуйте онлайн!
источник
1\n1\n
Некоторое время назад была дискуссия в чате, которая подразумевала, что в RProgN будет не изменяющий квин, потому что каждая из 1-ых печатает друг друга (и это будет считаться мошенничеством, если каждая 1-ая печатает сама). Все это на самом деле подразумевает, что обман в квази иногда бывает трудно определить. (Тем не менее, этот ответ в любом случае верен, потому что вопрос на самом деле не требует, чтобы квин не обманывал, просто позволяет .)1\n
технически допустимая квинна, как1
не константа, а вызов функции, которая выталкивает1
в стек.Джольф, 6 байт
При запуске это выводит:
Который в свою очередь выводит
1q_a_q
.Попробуй это здесь!
объяснение
источник
JavaScript (ES6),
696059 байтВыходы:
-1 байт (@ETHProductions): используйте 0 в регулярном выражении вместо \ d
источник
n=>1-n
вместоn=>+!+n
.1
конечном итоге его заменит регулярное выражение.Баш + Сед, 15 байт
Та же идея, что и у Денниса .
источник
Баш,
Коти Рев,1916 байт-3 благодаря @izabera
источник
Bash
,Tac
и `Rev?rev $0 # 0$<space><space>ver
по какой-то причине я не могу поставить два пробела в комментарииtac
rev
естьcat
.> <>, 16 байт
Попробуй это здесь!
Выходы
Это модификация представленной здесь . Я не уверен, что это обман, он читает кодовое поле и выводит его.
источник