Двонаправлена ​​ланцюжок 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.