Двонаправлена ​​ланцюжок Quine


9

PPCG вже не вистачало ласощів ...

Виклик:

Ваше завдання - створити програму "A0". Якщо ця програма працює без вводу, вона нічого не виводить. Коли ця програма запускається з введенням, вона виводить "A1". Коли "A1" працює без вводу, він виводить "A0". Коли "A1" працює з входом, він виводить "A2". В значній мірі, "A (k)" видасть "A (k-1)" при запуску без введення, і виведе "A (k + 1)" при запуску з входом.

Деталі

Я вважаю, що цей виклик досить простий; Інших правил насправді немає. Кожна програма повинна, до речі, містити принаймні 1 байт. Ви можете припустити, що вхід складається з лише символів ASCII, і ви можете ігнорувати пробіли, якщо хочете, але ви не можете вказати конкретний ввід. Вихід може бути або STDOUT, або STDERR, але всі ваші програми повинні виводити на один і той же. Інший також може містити текст (тому ви можете вивести STDOUT, а потім вийти з помилкою). Дякуємо @Dennis за вказівку на це.

Усі програми повинні бути однаковою мовою, і кожна програма повинна бути унікальною від решти.

Оцінка дорівнює тривалості програми "A0". Оскільки це проблема з кодовим гольфом, виграє найнижчий бал!


Мені сумно передбачити, що в більшості подань буде A (k) та A (k + 1), що відрізнятиметься тим, що додається до зростаючого рядка один символ :(
Sparr

@Sparr На жаль, це, мабуть, так і станеться. :( Ну добре, я не можу зрозуміти, як зробити чітке правило проти цього.
HyperNeutrino

ви можете вивести лише одне з двох, я не маю зусиль, якщо я інтерпретую це правильно. Якщо ми друкуємо потрібний вихід на STDOUT, чи повинен STDERR бути порожнім? Тому що невірно дозволяється вихід із помилкою.
Денніс

Чи повинні всі програми бути різними? Питання не говорить про це.

4
Також, чи можу я запропонувати дещо виразнішу назву на кшталт "Двонаправлена ​​ланцюжок ланцюгів"? "super meta quine" не означає багато, що перевищує програми, що друкують інші програми, і ускладнить пошук цієї проблеми в майбутньому.
Мартін Ендер

Відповіді:


1

Піп , 28 байт

V Y"I#qSti0+i?`V Y`.RPyRtiu"

Спробуйте в Інтернеті!

Пояснення

Це модифікована версія найкоротшої відомої квітки Піп V Y"`V Y`.RPy". Ця квітина працює, визначаючи рядок, перебираючи її в yзмінну, а потім оцінюючи її. Коли оцінюється, рядок приймає репр y(таким чином загортаючи значення yу подвійні лапки) і з'єднує буквений зразок `V Y`у передню частину.

Наша стратегія полягає в покласти 0в програмі, а потім замінити 0з , 10якщо був вхід, або замінити 10з , 0якщо не було ніякого входу. (Таким чином, A ( k ) буде містити число, що складається з k 1's, а потім - 0.) 0і 10зручно, оскільки є вбудовані змінні ( iі t, відповідно) з цими значеннями, тому ми можемо посилатися на них без використання фактичних цифр .

Тож замість цього RPyми хочемо, RP yRitчи був вхід, а RP yRtiякщо ні. Ми можемо поєднати два випадки, поміняючи значення значень tта, iякщо є вхід ( I#q Sti), то робимо RP yRti. (Ми повинні перевірити #q, довжина вводу, тому що такі входи 0є фальсийними.)

Тепер нам залишається лише отримати літерал 0у коді та обробити особливий випадок A0, який не дає виводу. І те й інше можна вирішити шляхом тестування 0+iта повернення, uякщо це фальси:

  • Для будь-якого k > 0 число в A ( k ) буде ненульовим і, отже, правдоподібним (наприклад 110+i).
  • Для k = 0 число в A ( k ) буде дорівнює нулю:
    • Якщо є вхід, iі tвони поміняються місцями і iдорівнює 10. 0+iвсе ще є правдою.
    • Якщо введення немає, iвсе одно 0 і 0+iє фальсиєю. Замість ядра quine ми виводимо u, що є вбудованою змінною для нуля. Друк нуля не дає виводу.

Хороша робота! Працює як шарм.
HyperNeutrino

1

Python 2, 93 байти

Існує зворотний підвод.

p=1+2*bool(input())-1;s='print"p=%r+2*bool(input())-1;s=%r*(p>0);exec s"%(p,s)'*(p>0);exec s

Спробуйте це з введенням | Спробуйте без введення

Це видозмінено з моєї відповіді на подібне запитання.

Якщо є вхід, то він збільшиться p. Таким чином, в результаті чого програма буде p=2+..., p=3+...і т.д.


Це не визнає 0 як вхідне
fəˈnɛtɪk

@LliwTelracs Вхід має бути оточений лапками (це має бути жало). Дивіться гіперпосилання у відповіді.
mbomb007

Так само, програма працює з рядками та всіма числами, окрім 0.
fəˈnɛt 28k

1
@LliwTelracs Добре не намагайся потім використовувати цифри. Відповідно до консенсусу, я можу використовувати input()та вимагати введення в оточенні лапок, а не використання raw_input(). Якщо ви хочете ввести нуль, використовуйте "0".
mbomb007

Приємне рішення! Я очікував, що більшість відповідей будуть нескінченно зростати в довжині (технічно це є, але не в тому ж сенсі). Хороша робота!
HyperNeutrino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.