Обман циклічної квінки


19

Концепція

Напишіть програму, яка виводить код своєю мовою програмування. Цей код при виконанні повинен виводити оригінальну програму.

Правила

  • Оскільки це обман, то ви можете прочитати вихідний код.
  • Перша вихідна програма повинна бути тією ж мовою, що і вихідна програма.
  • Ви не можете виводити звичайну квинку. Дві програми повинні бути різними.
  • Застосовуються стандартні лазівки.
  • Це тому найкоротша відповідь виграє, однак вона не буде обрана.

Я все ще не зовсім впевнений, що являє собою напівквітка.
Conor O'Brien

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

1
Я бачу. Формулювання досить розпливчасте.
Conor O'Brien

2
Чому не буде обрана найкоротша відповідь? Це каталог?
Атако

1
Щойно для запису, я б назвав це взаємною королевою (для цього виклику потрібні різні мови).
Мартін Ендер

Відповіді:



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(який є). Перший вихід команди вибирає формат виводу; у цьому випадку це формат 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

Пітон 3, 297 279 251 243 225 218 208 180 126 111 байт

Не обман:

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}))

яка при виконанні друкує оригінальну програму.


Оце Так! Класно! Я ніколи б не подумав про це.
dkudriavtsev

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технічно є дійсним quine, оскільки 1це не константа, а виклик функції, яка натискає 1на стек.
Атако

Існує кілька визначень належної лайки у використанні. Це невірно хоча б одним, але можливо, дійсним для деяких інших.

@ ais523 Ви викликали мою цікавість, Ви вказали RProgN, але я не думав, що моя маленька мова привертає таку велику (або будь-яку) увагу. Чи було чат про RProgN зокрема, чи мова з подібним синтаксисом?
Атако

Було близько 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.
Conor O'Brien

@Conner O'Brien На жаль, в 1кінцевому підсумку заміниться регулярним виразом.
darrylyeo

@ETHproductions Хе, я мав би про це подумати.
darrylyeo



1

> <>, 16 байт

"$r00gol?!;50.01

Спробуйте тут!

Виходи

"$r00gol?!;50.10

Це модифікація поданої тут . Я не впевнений, чи це обман, він зчитує кодове поле і виводить його.


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

@Tealpelican, дякую! Мета полягає в тому, щоб це вважалося "обманом", хоча: с. (І я не повністю розумію це правило)
redstarcoder
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.