Уроборос Куайн n-уровня

11

Этот quine ouroboros на 128 языков (программа, которая выводит программу на другом языке, которая выводит программу на еще одном языке (125 языков позже), которая выводит оригинальную программу), довольно впечатляет. Но, к сожалению, он имеет статическое количество итераций.

Напишите программу, которая выводит программу (не обязательно на другом языке, но может быть), которая выводит программу, которая выводит программу и т. Д., Которая после n итераций выводит исходную программу в первый раз (то есть без промежуточного Программа должна быть такой же, как и оригинал, потому что в противном случае сработает квинэна, которая игнорирует ее ввод), где n - неотрицательное целое число, предоставленное в качестве ввода. Входные данные не могут быть просто числом в исходном исходном коде (например, помещаться x = <the value of n>в начало вашей программы), оно должно быть одним из следующих:

  1. Передано как аргумент командной строки
  2. Читать со стандартного ввода
  3. Передается в качестве аргумента функции, которая возвращает / выводит новую программу.

Для промежуточных этапов в ouroboros ваша программа может быть либо полностью функционирующей программой, либо функцией без аргументов, которая при вызове возвращает / выводит следующую.

Вы не можете читать из самого исходного файла или использовать встроенные функции типа quine (я не думаю, что есть такие, которые могли бы это сделать, но они могут быть)

Чтобы было понятно, если n = 0программа должна выводить свой собственный исходный код.

Если n = 1, программа должна выводить другую программу, которая выводит исходный исходный код.

И так далее...

Побеждает несколько байтов!

Редактировать:

Я должен был написать «Для промежуточных этапов в уроборосе ваша программа может быть либо полностью функционирующей программой без ввода , либо функцией без аргументов». Если ваша программа выводит следующий в цепочке, затем ждет ввода, это нормально, но вашей программе не нужно исходное значение n.

Лео Тененбаум
источник
Связанные , связанные .
Кевин Круйссен
Можем ли мы 1 индекс N? Поэтому n = 1 означает печать исходного кода, n = 2 означает печать кода, который будет печатать исходный код и т. Д.
действия данных
1
Будут ли версии итераций иметь начальный ввод? Допустим, мой первый ввод - 3, и я запускаю программу, которую он выводит. Будет ли вход 3 или нет вообще? Если нет ввода, я думаю, нам нужно обработать это в случае, если что-то подобное getInput()используется без какого-либо ввода. Или можно сказать, что мы вводим что-то случайное, что не используется для последующих итераций, чтобы избежать ошибок для getInput()? Ака текущий ответ Python действителен?
Кевин Круйссен
Я подозреваю, что то, что нас просят сделать, это, учитывая целое число n, вывести программу, которая является «исходной программой» для иворической пятерки nитераций, и что наш ответ не должен учитываться как одна из nитераций. Это правильно?
Эрик Outgolfer
@KevinCruijssen Я, наверное, должен был быть более ясным об этом. Промежуточные этапы не могут иметь вклад в любой форме. Я предполагаю, что если программа выведет следующий, а затем ждет ввода, это было бы хорошо.
Лев Тененбаум

Ответы:

5

05AB1E , 28 байтов

-4 байта + исправление благодаря Кевину Круйссену

"34çìD«s<©di®ì"34çìD«s<©di®ì

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


объяснение

Это работает, добавляя оставшееся число для печати в начале кода, что означает, что оно добавляется в стек так же, как ввод. В базовом случае ввода «0» он не будет объединять 0 на передней панели.

Истек срок действия данных
источник
dявляется неотрицательным ( >=0) вместо положительного ( >0). Проблема заключается в том, что для проверки, dне выдавая ее, сначала нужно продублировать ее, но затем она также должна быть отброшена на итерации 0"quinsting", иначе она выдаст дубликат 0. :(
Кевин Круйссен
"34çìD«s<©di®ì"34çìD«s<©di®ìдля 28 байтов, возможно (что все еще довольно близко к вашему намеченному подходу)? (Боюсь, ваша текущая версия для итерационных 0"34çìD«s<Ddiì"34çìD«s<Ddiìвыходов -1из Duplicate ..)
Кевин Круйссен
4

Рунические чары , 39 байт

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

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

Будет на 4 байта короче, чем 05AB1E, используя ту же тактику, если входные данные меньше или равны 10. Но так как нам нужно поддерживать сколь угодно большие значения, это становится все сложнее.

Числовое значение nпомещается спереди и анализируется как непрерывное число с использованием литерала ´. "3X4+kSqосновной код квин Если в передней части нет значения, длина стека будет только 1 (квинета), в противном случае 2 позволит l1=d*?определить, как обрабатывать вещи оттуда.

  • Если есть значение, S:1-}'LA2+-}запускается: поменяйте местами значение на верх, вычтите 1, продублируйте его, оставив копию на дне стека, получите Log 10 этого значения, умноженного на 100 (в результате чего длина символа будет равна плюс 1 для ´), удалите столько символов из конца строки (эффективно обрезая себя до конца, и там , где это не нужно, и потому что оно имеет неправильное значение). Cна один байт короче 2+и приводит к тому же значению.

  • Если значения нет, прочитайте одно из ввода.

Безотносительно: :0)2*?дублируй и сравни с ноль.

  • Если ненулевой толчок ´.

  • Если ноль, поп значение. Мы можем обмануть, используя !вместо, 2?и сохранить байт, потому что при ´попытке выполнить первый байт, который он видит, не является числовым и немедленно выпадает из числового режима в той же позиции.

Напечатайте всю стопку сверху вниз.

Draco18s больше не доверяет SE
источник
3

Java 10, 145 байт

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Попробуйте онлайн и посмотрите результаты некоторых итераций .

Объяснение:

объяснение:

  • var sСодержит исходный код неформатированную
  • %s используется, чтобы поместить эту строку в себя с s.format(...)
  • %c, %1$cи 34используются для форматирования двойных кавычек
  • s.format(s,34,s) складывает все вместе

Задача часть:

Первая лямбда-функция принимает longвходные данные в качестве параметра.

  • Это устанавливается в переменной Long N=n;в первой итерации. Или Long N=%s;для следующих итераций.
  • Тернарная проверка N>0?N-1+"L":"n"заполнит его %sзначением N-1, к которому добавлено значение Llong, и преобразует его в String для %s, если значение Nбольше 1. Если Nвместо этого 0 (начальный ввод был 0или это последняя итерация interquine- ' loop '), вместо этого он будет заполнен %sначальным n.
Кевин Круйссен
источник
Спецификация говорит, что промежуточные выходы должны быть полной программой или функцией без аргументов
Embodiment of Ignorance
@EmbodimentofIgnorance Я знаю, это то, что у меня есть. Первая лямбда-функция принимает longпараметр-функцию, а другие лямбда-функции принимают неиспользуемый Voidпараметр , который я также всегда использую для вызовов, утверждающих, что не нужно вводить, потому что v->на 1 байт короче, чем ()->.
Кевин Круйссен
2

Haskell , 195 164 байта

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

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

Это использует довольно простую технику Куайна. Мы модифицируем его переменной, aкоторая установлена ​​в число. Если это число равно нулю (что и есть в начале), мы берем ввод и выводим наш источник с aустановленным значением ввода. Если aне ноль, мы выводим наш источник с aустановленным на единицу меньше. Этот способ aотсчитывает до нуля перед выводом исходного источника.

Специальный охотник за гарфами
источник
2

R , 92 байта

f=function(n=-1){gsub("\\s","",paste("f=",sub("-?\\d+",n-1,paste(deparse(f),collapse=""))))}

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

Если deparseсчитается мошенничеством, вот альтернатива:

R , 108 байт

function(n=-1){s="function(n=%d){s=%s%s%2$s;sprintf(s,n-1,intToUtf8(34),s)}";sprintf(s,n-1,intToUtf8(34),s)}

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

Ник Кеннеди
источник
1

Perl 6 , 44 байта

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

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

Принимает ввод через стандартный ввод и возвращает программу, в которой изменилось только первое число. Каждая последующая программа затем выводит ту же программу, за исключением того, что это число уменьшается.

Джо Кинг
источник
1

C # (интерактивный компилятор Visual C #) , 112 байт

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Благодаря @NickKennedy удалось сэкономить много байтов!

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

Воплощение невежества
источник
Промежуточные выходы не являются ни полной программой, ни функцией, которая принимает один аргумент. Также я думаю, что у вас есть некоторые ns, которые должны быть ls. Как насчет tio.run/##Sy7WTS7O/P@/…
Ник Кеннеди,
1

Python 3.8 (предварительная версия) , 60 56 55 53 байта

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

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

-2 байта благодаря Джо Кингу

Начиная с версии 53 байта, также работает в Python 2 и Python 3.

минус семь
источник
Промежуточная функция, похоже, не является полной программой или функцией, которая не принимает аргументов.
Ник Кеннеди
Этот оператор моржа :=- долгожданное дополнение к Python, это точно.
mbomb007
«Для промежуточных этапов в уроборосе ваша программа может быть либо полностью функционирующей программой, либо функцией без аргументов , которая при вызове будет возвращать / выводить следующую».
mbomb007
@NickKennedy Обновлен в соответствии со спецификацией и по совпадению сохранил 4 байта.
отрицательное семь
1
53 байта без использования:=
Джо Кинг