Обман Циклический Куайн


19

концепция

Напишите программу, которая выводит код на своем языке программирования. Этот код при выполнении должен выводить оригинальную программу.

правила

  • Поскольку это обманщик, вы можете прочитать исходный код.
  • Первая программа вывода должна быть на том же языке, что и исходная программа.
  • Вы не можете выводить обычную квинну. Две программы должны быть разными.
  • Применяются стандартные лазейки.
  • Это поэтому выигрывает самый короткий ответ, однако он не будет выбран.

Я до сих пор не совсем уверен, что представляет собой полуквин.
Конор О'Брайен

@ ConorO'Brien Он выводит программу, которая выводит оригинальную программу
dkudriavtsev

1
Понимаю. Формулировка довольно расплывчата.
Конор О'Брайен

2
Почему не будет выбран самый короткий ответ? Это каталог?
ATaco

1
Просто для справки, я бы назвал это взаимной формой ( хотя для этой задачи требуются разные языки).
Мартин Эндер

Ответы:


28

Bash + coreutils, 11 байт

tr xy yx<$0

Это печатает

tr yx xy<$0

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

В свою очередь, это печатает

tr xy yx<$0

1
Не чит, а на общем языке.
Denson

8
Я думаю, что trкоманда перенаправлена ​​на $0который является собственным исходным кодом. Так что это "обманщик".
Роман Грэф

21

Улитки, 0 байт



Вторая программа

1

Первая программа подсчитывает количество совпадений пустого шаблона на пустом входе (который действительно имеет область 0, но шаблон всегда запускается как минимум один раз как хак, чтобы позволить программам решать, что они хотят напечатать на пустом вводе). Вторая программа начинается с квантификатора (как {1}в регулярном выражении), который вызывает ошибку разбора. Поскольку программа не выполняет синтаксический анализ, STDOUT является пустой строкой.


Я думал, что, вероятно, был язык, который сделал это (то есть, нулевая программа успешно работает с непустым результатом, но этот результат ничего не делает как программа). Я попробовал HOMESPRING, но не смог заставить переводчика работать. Похоже, вы нашли другой язык, где он работает, хотя. (У вас есть ссылка на переводчика?)


20

7 , 2 байта

7 использует 3-битный набор символов, но принимает ввод, упакованный в байты (и согласно мета, языки с суббайтовыми наборами символов подсчитываются с использованием байтов для файла на диске ). Вот xxdдамп программы:

00000000: 4cf4                                     L.

При передаче этого файла интерпретатору 7 он выведет следующую программу:

00000000: 4fa6 7f                                  O..

который, в свою очередь, снова выведет исходную программу.

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

231 7 23 Оригинальная программа, распакована в восьмеричное
231 Нажмите 237 на стек
    23 толчок 23 на стек
             (неявный) добавить копию вершины стека в программу
      2       Дублирование вершины стека (на данный момент 23 )
        3      Вывод вершины стека, всплывающий второй элемент стека

На этом этапе интерпретатор 7 видит, что вершина стека содержит команды ( 2и 3), которые не могут быть представлены, поэтому он выходит из вершины стека, создавая 723(что есть). Первая команда output выбирает формат вывода; в данном случае это формат 7, «форматировать вывод так же, как и программу». Таким образом, команды упакованы в байты. Затем программа продолжается:

231 7 23 23
             (неявный) добавить копию вершины стека в программу
        2     Дублирующая вершина стека (в настоящее время 237 )
          3    Выведите верхнюю часть стека, вставьте второй элемент стека
           7   Поместите пустой элемент в стек

На данный момент в стеке нет ничего, кроме пустых элементов стека, поэтому программа завершается. Мы выводим 23раньше. Если мы убегаем 237(а нам нужно, потому что он содержит непредставимые команды), мы получаем 7231. Он получает выходные данные напрямую, делая окончательный вывод программы 237231(форматируется так же, как программа, то есть упаковывается в байты). Это 4fa67f. (Можно отметить, что это 1было совершенно бессмысленно с точки зрения влияния на результат; единственная причина, по которой это происходит, состоит в том, чтобы сделать две программы разными.)

Бег 237231продолжается почти точно так же; разница в том, что бесполезные 1запускаются сразу после первой печати (и пустой элемент неявно удаляется во второй раз, когда достигается текущий конец программы). Опять же, в 231конечном итоге выводится сам, в 23конечном итоге выводится сам перед ним 7, и мы получаем 231723исходную программу.

Наблюдатель может заметить, что две программы, несмотря на одинаковую длину в «нативном» восьмеричном языке, имеют разную длину на диске. Это потому, что 7-ми программа может быть дополнена произвольным числом в 1 бит, а упакованный формат отбрасывает конечный отступ. Вот как происходит кодирование:

2  3  1  7  2  3
010011001111010011(1...)
4   c   f   4   padding

Другими словами, двух байтов 4C F4достаточно для представления программы, так что это все, что я использовал.


11

Python 3, 297 279 251 243 225 218 208 180 126 111 байтов

Non-жульничество:

A=''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))''';print(("A="+("'"*3+A)*2).translate({65:66,66:65}))

Это печатает:

B=''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))''';print(("B="+("'"*3+B)*2).translate({65:66,66:65}))

который при выполнении печатает оригинальную программу.


Вот это да! Здорово! Я бы никогда не подумал об этом.
дкудрявцев

8

Пакетный, 14 байтов

@echo @type %0

Который при запуске в качестве cyclicquine.batвыходов

@type cyclicquine.bat

Который при запуске выводит оригинальный пакетный файл.


8

RProgN , 4 байта.

Сообщество, похоже, рассматривает подобные вещи как обманщик , который, таким образом, удовлетворяет критериям.

1
2

С завершающим переводом строки.

Это печатает

2
1

С завершающей новой строкой, которая печатает первый код.

RProgN печатает выталкивание стека сверху вниз.

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


1\n1\nНекоторое время назад была дискуссия в чате, которая подразумевала, что в RProgN будет не изменяющий квин, потому что каждая из 1-ых печатает друг друга (и это будет считаться мошенничеством, если каждая 1-ая печатает сама). Все это на самом деле подразумевает, что обман в квази иногда бывает трудно определить. (Тем не менее, этот ответ в любом случае верен, потому что вопрос на самом деле не требует, чтобы квин не обманывал, просто позволяет .)

Кроме того, хотя я неохотно говорил, что в RProgN 1\nтехнически допустимая квинна, как 1не константа, а вызов функции, которая выталкивает 1в стек.
ATaco

Есть несколько определений правильного использования Quine. Это недействительно, по крайней мере, одним, но, возможно, допустимо некоторыми другими.

@ ais523 Вы пробудили моё любопытство, вы указали RProgN, но я не думал, что мой маленький язык привлек к себе такое (или любое) внимание. Был ли разговор о RProgN в частности или о языке с похожим синтаксисом?
ATaco

Было около 7 , что также имеет тенденцию печатать сегменты программы «назад». Я экстраполировал мнения, высказанные там.

6

Джольф, 6 байт

1q_a_q

При запуске это выводит:

q_a_q1

Который в свою очередь выводит 1q_a_q.

Попробуй это здесь!

объяснение

1q_a_q
1       the digit one (ignored)
 q      the source code (ignored)
     q  the source code
    _   reversed
   a    and outputted
 _      and reversed (ignored)

q_a_q1
q       the source code (ignored)
     1  the digit one (ignored)
    q   the source code
   _    reversed
  a     and outputted
 _      and reversed (ignored)

5

JavaScript (ES6), 69 60 59 байт

(_0=_=>console.log(`(_0=${_0})()`.replace(/0/g,n=>+!+n)))()

Выходы:

(_1=_=>console.log(`(_1=${_1})()`.replace(/1/g,n=>+!+n)))()

-1 байт (@ETHProductions): используйте 0 в регулярном выражении вместо \ d


Попробуй n=>1-nвместо n=>+!+n.
Конор О'Брайен

@Conner O'Brien К сожалению, в 1конечном итоге его заменит регулярное выражение.
Darrylyeo

@ETHproductions Хех, я должен был подумать об этом.
Darrylyeo


3

Баш, Кот и Рев, 19 16 байт

rev $0 # 0$  ver

-3 благодаря @izabera


Не будет ли Bash, Tacи `Rev?
Конор О'Брайен

rev $0 # 0$<space><space>verпо какой-то причине я не могу поставить два пробела в комментарии
izabera

О, приятно @izabera
NoOneIsHere

@ ConorO'Брайен Нет, -ед tac revесть cat.
NoOneIsHere

@SeeOneRhino Ох .... Понятно
Конор О'Брайен

1

> <>, 16 байт

"$r00gol?!;50.01

Попробуй это здесь!

Выходы

"$r00gol?!;50.10

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


1
Вы можете изменить 00g на: 2-, и он сохранит тот же счетчик байтов, не читая кодовое поле.
Тил пеликан

@Tealpelican, спасибо! Цель состоит в том, чтобы это считалось "обманом", хотя: p. (И я не совсем понимаю это правило)
redstarcoder
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.