Этот quine ouroboros на 128 языков (программа, которая выводит программу на другом языке, которая выводит программу на еще одном языке (125 языков позже), которая выводит оригинальную программу), довольно впечатляет. Но, к сожалению, он имеет статическое количество итераций.
Напишите программу, которая выводит программу (не обязательно на другом языке, но может быть), которая выводит программу, которая выводит программу и т. Д., Которая после n итераций выводит исходную программу в первый раз (то есть без промежуточного Программа должна быть такой же, как и оригинал, потому что в противном случае сработает квинэна, которая игнорирует ее ввод), где n - неотрицательное целое число, предоставленное в качестве ввода. Входные данные не могут быть просто числом в исходном исходном коде (например, помещаться x = <the value of n>
в начало вашей программы), оно должно быть одним из следующих:
- Передано как аргумент командной строки
- Читать со стандартного ввода
- Передается в качестве аргумента функции, которая возвращает / выводит новую программу.
Для промежуточных этапов в ouroboros ваша программа может быть либо полностью функционирующей программой, либо функцией без аргументов, которая при вызове возвращает / выводит следующую.
Вы не можете читать из самого исходного файла или использовать встроенные функции типа quine (я не думаю, что есть такие, которые могли бы это сделать, но они могут быть)
Чтобы было понятно, если n = 0
программа должна выводить свой собственный исходный код.
Если n = 1
, программа должна выводить другую программу, которая выводит исходный исходный код.
И так далее...
Побеждает несколько байтов!
Редактировать:
Я должен был написать «Для промежуточных этапов в уроборосе ваша программа может быть либо полностью функционирующей программой без ввода , либо функцией без аргументов». Если ваша программа выводит следующий в цепочке, затем ждет ввода, это нормально, но вашей программе не нужно исходное значение n.
getInput()
используется без какого-либо ввода. Или можно сказать, что мы вводим что-то случайное, что не используется для последующих итераций, чтобы избежать ошибок дляgetInput()
? Ака текущий ответ Python действителен?n
, вывести программу, которая является «исходной программой» для иворической пятеркиn
итераций, и что наш ответ не должен учитываться как одна изn
итераций. Это правильно?Ответы:
05AB1E , 28 байтов
-4 байта + исправление благодаря Кевину Круйссену
Попробуйте онлайн!
объяснение
Это работает, добавляя оставшееся число для печати в начале кода, что означает, что оно добавляется в стек так же, как ввод. В базовом случае ввода «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
изD
uplicate ..)Рунические чары , 39 байт
Попробуйте онлайн!
Будет на 4 байта короче, чем 05AB1E, используя ту же тактику, если входные данные меньше или равны
10
. Но так как нам нужно поддерживать сколь угодно большие значения, это становится все сложнее.Числовое значение
n
помещается спереди и анализируется как непрерывное число с использованием литерала´
."3X4+kSq
основной код квин Если в передней части нет значения, длина стека будет только 1 (квинета), в противном случае 2 позволитl1=d*?
определить, как обрабатывать вещи оттуда.Если есть значение,
S:1-}'LA2+-}
запускается: поменяйте местами значение на верх, вычтите 1, продублируйте его, оставив копию на дне стека, получите Log 10 этого значения, умноженного на 100 (в результате чего длина символа будет равна плюс 1 для´
), удалите столько символов из конца строки (эффективно обрезая себя до конца, и там , где это не нужно, и потому что оно имеет неправильное значение).C
на один байт короче2+
и приводит к тому же значению.Если значения нет, прочитайте одно из ввода.
Безотносительно:
:0)2*?
дублируй и сравни с ноль.Если ненулевой толчок
´
.Если ноль, поп значение. Мы можем обмануть, используя
!
вместо,2?
и сохранить байт, потому что при´
попытке выполнить первый байт, который он видит, не является числовым и немедленно выпадает из числового режима в той же позиции.Напечатайте всю стопку сверху вниз.
источник
Java 10, 145 байт
Попробуйте онлайн и посмотрите результаты некоторых итераций .
Объяснение:
Куайн объяснение:
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
, к которому добавлено значениеL
long, и преобразует его в String для%s
, если значениеN
больше 1. ЕслиN
вместо этого 0 (начальный ввод был0
или это последняя итерация interquine- ' loop '), вместо этого он будет заполнен%s
начальнымn
.источник
long
параметр-функцию, а другие лямбда-функции принимают неиспользуемыйVoid
параметр , который я также всегда использую для вызовов, утверждающих, что не нужно вводить, потому чтоv->
на 1 байт короче, чем()->
.Haskell ,
195164 байтаПопробуйте онлайн!
Это использует довольно простую технику Куайна. Мы модифицируем его переменной,
a
которая установлена в число. Если это число равно нулю (что и есть в начале), мы берем ввод и выводим наш источник сa
установленным значением ввода. Еслиa
не ноль, мы выводим наш источник сa
установленным на единицу меньше. Этот способa
отсчитывает до нуля перед выводом исходного источника.источник
Желе ,
2220 байтПопробуйте онлайн!
Попробуйте повторные вызовы кода
источник
R , 92 байта
Попробуйте онлайн!
Если
deparse
считается мошенничеством, вот альтернатива:R , 108 байт
Попробуйте онлайн!
источник
Perl 6 , 44 байта
Попробуйте онлайн!
Принимает ввод через стандартный ввод и возвращает программу, в которой изменилось только первое число. Каждая последующая программа затем выводит ту же программу, за исключением того, что это число уменьшается.
источник
C # (интерактивный компилятор Visual C #) , 112 байт
Благодаря @NickKennedy удалось сэкономить много байтов!
Попробуйте онлайн!
источник
n
s, которые должны бытьl
s. Как насчет tio.run/##Sy7WTS7O/P@/…Python 3.8 (предварительная версия) ,
60565553 байтаПопробуйте онлайн!
-2 байта благодаря Джо Кингу
Начиная с версии 53 байта, также работает в Python 2 и Python 3.
источник
:=
- долгожданное дополнение к Python, это точно.:=