Двунаправленная цепочка Quine


9

PPCG уже не хватало муки уже ...

Вызов:

Ваша задача - создать программу «А0». Когда эта программа запускается без ввода, она ничего не выводит. Когда эта программа запускается со входом, она выводит «A1». Когда «А1» работает без входа, он выдает «А0». Когда «A1» запускается со входом, он выводит «A2». В значительной степени, «A (k)» будет выводить «A (k-1)» при запуске без ввода и выводить «A (k + 1)» при запуске с вводом.

подробности

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

Все программы должны быть на одном языке, и каждая программа должна быть уникальной среди остальных.

Оценка равна длине программы "A0". Так как это соревнование по коду в гольф, выигрывает самый низкий балл!


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

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

вы можете выводить только один из двух, я не уверен, если я правильно интерпретировать это. Если мы печатаем нужный вывод в STDOUT, должен ли STDERR быть пустым? Потому что, как правило, разрешено выходить с ошибкой.
Деннис

Должны ли все программы быть разными? Вопрос не говорит об этом.

4
Кроме того, могу ли я предложить несколько более выразительный заголовок, такой как «Двунаправленная цепочка Куайна»? «Супер-мета-квина» не говорит о многом помимо программ, печатающих другие программы, и усложнит поиск этой задачи в будущем.
Мартин Эндер

Ответы:


1

Пип , 28 байт

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

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

объяснение

Это модифицированная версия самой короткой из известных Pip Quine V Y"`V Y`.RPy". Эта квинна работает, определяя строку, вставляя ее в yпеременную, а затем оценивая ее. При оценке строка принимает ответ y(таким образом, заключая значение yв двойные кавычки) и объединяет литерал шаблона в начале `V Y`.

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

Таким образом, вместо того RPy, чтобы, мы хотим, RP yRitесли был вход, и RP yRtiесли нет. Мы можем объединить два случая, меняя значения tи, iесли есть input ( I#q Sti), то делать RP yRti. (Мы должны проверить #q, по длине входного, так как входы , как 0это falsey.)

Теперь нам просто нужно получить литерал 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, что является встроенной переменной для nil. Печать ноль не производит вывод.

Отличная работа! Работает как шарм.
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


1
@LliwTelracs Ну, тогда не пытайтесь использовать числа. В соответствии с консенсусом, я могу использовать input()и требовать, чтобы ввод был заключен в кавычки, а не использование raw_input(). Если вы хотите ввести ноль, используйте "0".
mbomb007

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