Саморазвивающийся кодекс


41

Напишите программу (или функцию) (назовем ее P1), которая при запуске выводит другую программу P2 на том же языке и ровно на 1 байт длиннее P1.

Программа P2 при запуске должна вывести третью программу P3, которая на 1 байт длиннее P2. P3 должен выводить программу P4, которая на один байт длиннее P3 и т. Д. То же самое для P5, P6, ..., P∞.

Цепочка программ должна идти бесконечно или в такое место, где интерпретатор больше не может справиться (но должен оставаться теоретически верной программой на языке)

правила

  • Стандартные лазейки запрещены
  • Все программы в цепочке должны быть на одном языке
  • Нет данных. Вывод идет в стандартный вывод или возвращаемое значение функции
  • Программа должна завершиться через некоторое время. Программа, которая прекращает генерировать выходные данные после определенного промежутка времени, но никогда не завершает свою работу, не квалифицируется

Победит самая короткая программа P1 в байтах на каждом языке!


2
@ Οurous Что ??? Я сам не добавил этот тег ...
iBug

6
@iBug Независимо от того, разрешено ли представлению читать свой собственный исходный код?
Мартин Эндер

3
@iBug Тег quine запрещает его по умолчанию, и обычно это делает ответы более интересными. Это зависит только от вас.
Мартин Эндер

1
"puts <<2*2,2\nputs <<2*2,2\n\n2"увеличивается на 2 на каждой итерации в Ruby. Я не мог найти ничего лучше. : - /. Интересный вызов!
Эрик Думинил

Ответы:


28

JavaScript (ES6), 14 12 байт

-2 байта благодаря @Shaggy

f=_=>"f=_"+f

Тестовый фрагмент


Мне потребовалась секунда, чтобы заметить это. Подлый!
Лохматый

4
Может кто-нибудь объяснить, пожалуйста, я не могу обернуть голову, как это увеличивается?
htmlcoderexe

2
@htmlcoderexe добавляет "f=_"дополнительный символ _перед именем параметра, что приводит к увеличению его длины при каждой итерации.
Герман Л

9

7 , 4 байта ASCII

1603

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

Я знаю, что 7 обычно не кодируется в ASCII, но на этот раз это более удобное кодирование, поэтому мы добавляем 1 байт при каждом запуске, а не 3 бита.

Я также не уверен, считается ли это обманом или нет. (Обычно неясно, обманывает ли 7 quine, так как он перекрывает границу несколькими способами.) Вы можете привести приличный аргумент, который 0кодирует 6, но в целом неясно, откуда берутся результирующие символы «в 7, потому что у него так много, довольно странных, неявных поведений.

Эта программа печатает себя с 1добавлением, и будет делать это, даже если вы добавите число 1s к нему. Вот откомментированный след отладки 160311:

|| 160311      Initial data ||; initial program 160311
||7 60311      1 command = append 7 to data
|1 0311        6 command = escape from the last | onwards (7 escapes to 1)
|16e77         0311 commands = append 6e77 to data
|16e77 16e77   Implicit (program is empty): copy data past last | to program
|16e777 6e77   1 command = append 7 to data
71603111 e77   6 command = escape from the last | onwards
71603111 e77   e7 command = output in same encoding as the source

(В программе ничего не |осталось, поэтому eнемедленно выйдет из программы как побочный эффект, означающий, что финальные 7s никогда не запускаются).

Основная путаница в том, откуда берутся все символы, состоит в том, что большинство команд в 7 просто выдают данные при запуске, а затем 6пытаются восстановить последовательность команд, которая выдаст данный фрагмент данных; это часто заканчивается близко, но не идентично оригиналу. (В целях цитирования вы обычно пишете программу на 7 таким образом, что результат будет почти одинаковым, обычно различаясь в начальных или конечных 7s.) Так, например, 1данные в данных становятся 716, что является самым простым способом добавить 1к текущей строке данных. Мы изначально создали его с 16другой (но похожей) последовательностью символов, разрушительно удаляя один из|маркеры, с которых начинались данные. (Наверное, лучший аргумент в пользу того, что это не буквальная формула, состоит в том, что выходные данные отличаются от входных!)


9

Haskell , 74 66 байт

РЕДАКТИРОВАТЬ:

  • -2 байта H.PWiz с помощью <>, затем -6 путем перемещения (10*)<$>.

Теперь используется новый свободный <>оператор (для Semigroupумножения требуется, чтобы GHC 8.4 работал без импорта.)

main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1)

Попробуйте онлайн! (Читы с импортом, поскольку TIO еще не имеет GHC 8.4.)

Как это работает

  • main=putStr$ является шаблоном для вывода следующего строкового значения.
  • fst<>showявляется функцией, которая принимает кортеж и возвращает строку, состоящую из первого элемента кортежа, объединенного со строковым представлением кортежа. Т.е.

    (fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t)
  • (10*)<$>умножает последний элемент следующего кортежа на 10, добавляя цифру 0к его строковому представлению.


1
Вы можете сохранить как минимум 2 байта с(<>)
H.PWiz

@ H.PWiz Спасибо, получил больше, двигаясь (10*)<$>.
Орджан Йохансен

8

C (gcc) , 134 132 байта

Незначительная переделка канонической буквы С. Ужасно долго.

x;*s="x;*s=%c%s%c;main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}";main(i){for(i=__LINE__;i--;puts(&x));printf(s,34,s,34);}

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





4

брейкфак , 420 байт

->+++>>+++>+>++>+++>+>+>+++>>>>>>>>>>>>>>>>>>>>+>+>++>+++>++>>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>>+++>>+++>>>>>+++>+>>>>>>>>>++>+++>+++>+>>+++>+++>+>++>>+++>+>+++>+>++>+++>>>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>>>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>>>+++>+>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++[[<++++++++++++++++>-]<+++++++++.<]>.

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

Это модификация «стандартной» сущности BrainFuck , с .концом в конце, которая добавляет дополнительную .каждую итерацию.

Сама квинна кодирует символы Brainfuck в виде набора шестнадцатеричных цифр: в частности, шестнадцатеричных цифр c-0x2b, которые обычно следующие:

+: 0x00
-: 0x02
[: 0x30
]: 0x32
<: 0x11
>: 0x13
,: 0x01
.: 0x03

Кодировка охватывает два фрагмента кода: >++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++выдвигает кодировку самой кодировки, [[<++++++++++++++++>-]<+++++++++.<]обходит стек и печатает все.


3

Грязный , 9 байт

'"n[!]a!␛

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

'   start and end a string literal
"   push a literal '
n   remove newlines
[!] print the string
a   push the alphabet
!   print the first character
␛   end the program

Если чтение исходного кода разрешено:

Грязный , 8 байт

Q[!]W33!

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

Разъяснение:

Q   push the source code
[!] print each character
W   clear the now-empty stack
33! print an exclaimation mark

Может быть действительным:

Грязный , 4 байта

Q[‼]

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

Он печатает исходный код с завершающим переводом строки.
(И куча пробелов, из-за ошибки. Хотя без них все работает.)

Обратите внимание, что он работает только в собственном наборе символов, а не при использовании внешнего интерфейса UTF8 - поэтому, чтобы попробовать его на TIO, вам нужно заменить символ, который он выводит между символами []s , что является эквивалентом UTF8 для печати ,


1
4-байтовая версия определенно недействительна.
Эрик Outgolfer

3

Java 8, 162 146 байт

v->{String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"+1;return s.format(s,34,s).replaceAll("1+$","");}

Попробуйте онлайн.
Попробуйте первую программу вывода ; Попробуйте вторую программу вывода ; Попробуйте третью программу вывода .

Объяснение:

v->{                       // Method with empty unused parameter and String return-type
  String s="v->{String s=%c%s%1$c+1;return s.format(s,34,s).replaceAll(%1$c1+$%1$c,%1$c%1$c);}"
                           //  The unformatted source code
           +1;             //  Plus a random digit (1 in this case)
  return s.format(s,34,s)  //  Create the quine
          .replaceAll("1+$","");}
                           //  Then remove any trailing 1s

-part:

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

Задание часть:

  • +1 добавляет 1 к неформатированной и отформатированной программе.
  • .replaceAll("1+$","");}: Поскольку мы хотим увеличить количество байт программы только на единицу вместо двух, мы удаляем все завершающие 1 перед возвратом.



2

GolfScript , 9 байт

{'.~1'}.~

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

CJam , 9 байт

{"_~1"}_~

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

Я публикую оба этих решения в одном и том же ответе, поскольку они представляют собой просто тривиальные вариации друг друга и работают абсолютно одинаково. Они оба основаны на общей квине GolfScript {'.~'}.~(или {"_~"}_~в CJam), которая описана более подробно, например, в моем предыдущем ответе.

Разница лишь в том, что этот вариант добавляет 1байт к концу своего вывода. Как это случается, любая строка 1s (или любой другой целочисленный литерал без начальных нулей) сама по себе является тривиальной формой как в GolfScript, так и в CJam, поэтому любые строки, уже присутствующие в конце кода выше, будут просто дословно скопированы в вывод. Поскольку GolfScript (и CJam) используют целые числа произвольной длины, это будет работать для произвольно длинных программ, по крайней мере, до тех пор, пока компьютер, на котором выполняется код, имеет достаточно памяти для его хранения.


2

Атташе , 76 72 61 байт

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

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

Стандартный quine, который добавляет пробел в конец xпосле каждой итерации.

Первые несколько итераций:

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]] ",Repr[x+sp]]

Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]  ",Repr[x+sp]]

и т.п.

Атташе, 72 байта

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

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

Это просто вариант стандартного формата quine с переменной, yкоторая устанавливается 10*yпосле каждой итерации

Первые несколько итераций:

y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=10Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

y:=100Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]

и т.п.



1

Haskell , 88 байт

main=putStr$snd(span(<'m')s)++show s;s='#':"main=putStr$snd(span(<'m')s)++show s;s='#':"

Попробуйте онлайн! Увеличивается путем добавления #к строке данных.


Вы можете сэкономить немного, используя showбольше, чем просто строку и используя сопоставление с образцом. Попробуйте онлайн!
Орджан Йохансен,

@ ØrjanJohansen Отлично! За исключением базового стандарта Haskell quine, это совершенно другой подход, поэтому не стесняйтесь размещать его самостоятельно.
Лайкони

ОК, если вы так думаете.
Орджан Йохансен

1

Stax , 20 18 байт

"34s+cTZL"34s+cTZL

Запустите и отладьте его

Создает дополнительный пробел перед 2-й кавычкой при каждой итерации.

объяснение

Использует программу "34s+cTZL "34s+cTZLдля объяснения.

"34s+cTZL "34s+cTZL
"34s+cTZL "            String literal
           34s+        Prepend a double quote, Now the string is `"34s+cTZL `
               cT      Copy and trim trailing spaces
                 Z     Put a 0 under the top of stack
                       Stack now (from top to bottom): `["34s+cTZL,0,"34s+cTZL ]`
                  L    Collect all elements on stack, from bottom to top
                       Implicit output, 0 is converted to space.


1

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

"'<S@>

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

Это было странно. Все, что мне нужно было сделать, это удалить ~из оригинальной лебеды, найденной Джо Кингом .

Каждый дополнительный прогон добавляет другой <в конец, например:

"'<S@><<<<<<<<<

Все из которых ничего не делают.

Прямая копия этого ответа на связанный вызов. Так уж получилось, что он увеличивался на 1 байт за каждую итерацию (сильным аргументом для этого вызова является его дублирование или наоборот).



0

Чудо , 33 байта

f\ @(-> ol) ["f\ ";f;";f1";#0];f1

Интересный вариант нормальной квинны, который добавляет 1 после каждой итерации.

Прогрессирование:

f\ @(-> ol) ["f\ ";f;";f1";#0];f1
f\ @(-> ol) ["f\ ";f;";f1";#0];f11
f\ @(-> ol) ["f\ ";f;";f1";#0];f111
...

объяснение

f\ @                               #. Sets f to a function that does the following:
    (-> ol) [                      #.   Output each:
             "f\ ";                #.     String for declaration of f
                   f;              #.     Formatted representation of f's function
                     ";f1";        #.     String for call of f
                           #0      #.     Argument passed into f
                             ];f1  #. Call f with 1 as the argument

Одна из интересных частей этой статьи - Wonder может работать с числами произвольной точности, поэтому прогрессия не будет прерываться после определенного количества единиц.


0

ColdFusion, 277 байт

<cfset u=Chr(34)><cfset q="<cfset u=Chr(34)><cfset q=%s%s%s><cfoutput>%screateObject(%sjava%s,%sjava.lang.String%s).format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])%s</cfoutput>
"><cfoutput>#createObject("java","java.lang.String").format(q,[u,q,u,Chr(35),u,u,u,u,Chr(35)])#</cfoutput>

Это тривиальная модификация моей анкеты ColdFusion, которая добавляет новую строку каждый раз, когда она вызывается .

Протестировано локально на Lucee-Express-5.2.6.60


0

Пакет Windows, 38 36 байт

echo|set/p"=q">q&copy/b/y %0+q %0
::

Этот код создает файл с именем «q», содержащий букву «q», а затем добавляет его в исходный файл. Обратите внимание, что «::» - это псевдоним для «rem», который не требует дополнительного пробела.

Сохранено 2 байта благодаря пользователю 3493001.


0

Gol> <> , 7 байт

":r2ssH

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

Это простая вариация обычной Gol> <> квин, но она добавляется при Hкаждом запуске. Поскольку Hкоманда останавливает программу, дополнительные Hв конце не изменяют поведение.


0

T-SQL , 175 байт

DECLARE @ VARCHAR(MAX)='DECLARE @ VARCHAR(MAX)=*SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @'SET @=TRIM(REPLACE(@,0x2a,CHAR(39)+@+CHAR(32)+CHAR(39)))PRINT @

Сначала я написал SQL-квиню, а затем изменил ее, добавив дополнительный пробел (несколько вдохновленный этим ответом ).



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.