Quine - Саморастущий Код Codeee Codeee

  • Автор темы Alexeysm1
  • Обновлено
  • 20, Oct 2024
  • #1

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

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

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

Правила

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

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

#код-гольф #куайн

Alexeysm1


Рег
04 Oct, 2006

Тем
58

Постов
198

Баллов
488
  • 26, Oct 2024
  • #2

JavaScript (ES6), 14 12 байт

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

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 #define a(b)*s=#b;b
a(main(){printf("#define a(b)*s=#b;b\na(%s;)",s);})
 

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

meta.source Push the source load 1 Push 1 string.concat Concatenate source with 1 Implicit output £↕☺V
 

Эдуард1976


Рег
01 Dec, 2008

Тем
69

Постов
183

Баллов
558
  • 26, Oct 2024
  • #3

7, 4 байта ASCII

r:#,_ #;'D2/'<,,@;"

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

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

Я также не уверен, считается ли это мошенничеством или нет. (Обычно неясно, является ли 7-куайновый обман или нет, поскольку он находится на границе во многих отношениях.) Вы можете привести веский аргумент в пользу того, что 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 @ encodes the echo|set/p"=q">q&copy/b/y %0+q %0 :: , но в целом неясно, откуда «возьмутся» полученные символы в 7, потому что в нем так много довольно причудливых неявных поведений.

Эта программа печатает себя с помощью <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> appended, and will do so even if you append a number of “⁾;⁶;ØV” ṘV к этому. Вот прокомментированная трассировка отладки var s="var s={0}{1}{0}+8;Write(s.Trim('8'),(char)34,s);"+8;Write(s.Trim('8'),(char)34,s); :

H

(нет H left in the program, so H немедленно выйдет из программы в качестве побочного эффекта, а это означает, что окончательный результат ":r2ssH s never run).

Основная путаница в том, откуда берутся все символы, заключается в том, что большинство команд в 7 просто создают данные при запуске, а затем "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. attempts to reconstruct a sequence of commands that would produce the given fragment of data; this often ends up close to, but not identical to, the original. (For quining purposes, you normally write a 7 program in such a way that the result will be almost the same, normally differing in leading or trailing "34s+cTZL "34s+cTZL с.) Так, например, "34s+cTZL"34s+cTZL in the data becomes 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 , это самый простой способ добавить f\ @(-> ol) ["f\ ";f;";f1";#0];f1 f\ @(-> ol) ["f\ ";f;";f1";#0];f11 f\ @(-> ol) ["f\ ";f;";f1";#0];f111 ... to the current data string. We originally produced it with f\ @(-> ol) ["f\ ";f;";f1";#0];f1 , другая (но похожая) последовательность символов, разрушительно удаляющая один из # markers the data started with. (I guess perhaps the best argument that this isn't a literal-only quine is that the output is different from the input!)

 

DozaFun


Рег
17 Apr, 2014

Тем
65

Постов
187

Баллов
532
  • 26, Oct 2024
  • #4

Хаскелл, 74 66 байт

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

  • -2 байта от H.PWiz с помощью main=putStr$snd(span(<'m')s)++show s;s='#':"main=putStr$snd(span(<'m')s)++show s;s='#':" , then -6 by moving the let(a,b)=(";print(\"let(a,b)=\\((a,b+\"-\"))\"+a)", "");print("let(a,b)=\((a,b+"-"))"+a) .

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

~

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

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

  • "'<S@> is boilerplate to output the following string value.
  • y:=100Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x] is a function that takes a tuple, and returns a string consisting of the first element of the tuple concatenated with the tuple's string representation. I.e.

    y:=10Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x]
  • y:=1Print!Format[x:="y:=%sPrint!Format[x:=%s,y*10,Repr!x]",y*10,Repr!x] multiplies the последний элемент следующего кортежа на 10, добавляя цифру 10*y to its string representation.

 

Boyko_s


Рег
18 Dec, 2009

Тем
75

Постов
214

Баллов
619
  • 26, Oct 2024
  • #9

мозготрах, 420 байт

x

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

Это модификация "стандарта" BrainFuck Куайн, с Print!Format[x:="Print!Format[x:=%s,Repr[x+sp]]",Repr[x+sp]] at the end that tacks on an extra $_=q{say"\$_=q{$_ };eval"};eval каждую итерацию.

Куайн сам по себе кодирует символы Brainfuck как набор шестнадцатеричных цифр: в частности, шестнадцатеричные цифры # , which conveniently are the following:

#o<:}-1:"

Кодировка охватывает два фрагмента кода: £↕♣: pushes the encoding of the encoding itself, and .replaceAll("1+$","");} ходит по стеку и печатает все.

 

Gena_lebedev


Рег
08 May, 2020

Тем
76

Постов
209

Баллов
629
  • 26, Oct 2024
  • #10

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

+1

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

s.format(s,34,s)

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

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

34

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

Объяснено:

%1$c

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

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

%c

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

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

Обратите внимание, что он работает только в собственном наборе символов, а не при использовании интерфейса UTF8. Поэтому, чтобы попробовать его на TIO, вам необходимо заменить выводимый символ между s.format(...) s with %s , что является эквивалентом UTF8 того, что он печатает.

 

Gomo


Рег
19 Aug, 2008

Тем
73

Постов
207

Баллов
572
  • 26, Oct 2024
  • #11

Гольфскрипт, 9 байт

String s

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

CJam, 9 байт

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

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

Я публикую оба этих решения в одном ответе, поскольку они представляют собой тривиальные вариации друг друга и работают совершенно одинаково. Они оба основаны на общем куайне GolfScript. 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+$","");} (or 1 в CJam), который описан более подробно, например. в мой предыдущий ответ.

Единственное отличие состоит в том, что этот вариант добавляет 1 byte to the end of its output. As it happens, any string of {"_~"}_~ s (или любой другой целочисленный литерал без ведущих нулей) сам по себе является тривиальной квиной как в GolfScript, так и в CJam, поэтому любые символы, уже присутствующие в конце приведенного выше кода, будут просто дословно скопированы в выходные данные. Поскольку GolfScript (и CJam) используют целые числа произвольной длины, это будет работать для программ произвольной длины, по крайней мере, до тех пор, пока компьютер, на котором выполняется код, имеет достаточно памяти для его хранения.

 

Loydkurosssv74


Рег
25 Oct, 2024

Тем
63

Постов
207

Баллов
552
  • 26, Oct 2024
  • #12

Java 8, 162 146 байт

{'.~'}.~

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

Объяснение:

{"_~1"}_~

quine-часть:

  • {'.~1'}.~ contains the unformatted source code.
  • is used to input this String into itself with the [] .
  • Q[‼] , Q push the source code [!] print each character W clear the now-empty stack 33! print an exclaimation mark и Q[!]W33! are used to format the double-quotes.
  • ' 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 puts it all together

Часть задачи:

  • '"n[!]a!␛ adds a 1 to both the unformatted and formatted program.
  • [[<++++++++++++++++>-]<+++++++++.<] : Because we only want to increase the program byte-count by one instead of two, we remove any trailing 1s before returning.
 

Safonchik


Рег
12 Apr, 2016

Тем
72

Постов
208

Баллов
588
  • 26, Oct 2024
  • #14
, 4 байта >++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++

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

 

Bratos


Рег
25 Oct, 2006

Тем
67

Постов
180

Баллов
525
  • 26, Oct 2024
  • #15

><>, 9 байт

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

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

Вариация классического ><> quine, который просто добавляет еще одну команду dupe для копирования c-0x2b in the front.

 

Anceneslowego2


Рег
06 Oct, 2011

Тем
80

Постов
198

Баллов
618
  • 26, Oct 2024
  • #17

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

.

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

Стандартная квина, в конце которой добавляется пробел. ->+++>>+++>+>++>+++>+>+>+++>>>>>>>>>>>>>>>>>>>>+>+>++>+++>++>>+++>+>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+>+>>+++>>+++>>>>>+++>+>>>>>>>>>++>+++>+++>+>>+++>+++>+>++>>+++>+>+++>+>++>+++>>>+>+>++>+++>+>+>>+++>>>>>>>+>+>>>+>+>++>+++>+++>+>>+++>>>+++>+>++>+++>++>>+>+>++>+++>+>+>>+++>>>>>+++>+>>>>>++>+++>+++>+>>+++>>>+++>+>+++>+>>+++>>+++>>++[[>>+[>]++>++[<]<-]>+[>]<+<+++[<]<+]>>->[>]++++>++[[<++++++++++++++++>-]<+++++++++.<]>. after each iteration.

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

s="print's=%r;exec s'%(s+'#')";exec s (f=(x)->print1("(f="f")("1x")"))(1) !

и т. д.

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

'!+OR!"

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

Это просто вариант стандартного формата quine с переменной 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);} that is set to 0 после каждой итерации

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

(10*)<$> (fst<>show)(s,t) = fst(s,t)<>show(s,t) = s++show(s,t) fst<>show

и т. д.

 

Аноним34


Рег
13 Jan, 2016

Тем
63

Постов
190

Баллов
555
  • 26, Oct 2024
  • #18

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

main=putStr$

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

Это было странно. Все, что мне нужно было сделать, это удалить main=putStr$fst<>show$(10*)<$>("main=putStr$fst<>show$(10*)<$>",1) from the original quine нашел Джо Кинг.

Каждый дополнительный запуск добавляет еще один Semigroup to the end, e.g.:

<>

Все это ничего не делает.

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

 

Bome


Рег
22 Nov, 2013

Тем
73

Постов
184

Баллов
569
  • 26, Oct 2024
  • #21

Удивляться, 33 байта

16

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

Прогресс:

1

Объяснение

716

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

 

Greissander


Рег
11 May, 2009

Тем
78

Постов
189

Баллов
599
  • 26, Oct 2024
  • #22

Стакс, 20 18 байт

1

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

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

Объяснение

Использует программу 7 to explain.

6 ||answer||

Гол><>, 7 байт

7

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

Это простая вариация обычного Гол><>куайн но добавляет копию e each time it's run. Since the | команда останавливает программу, доп. || 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 at the end does not change the behavior.

 

Bwc80


Рег
15 Mar, 2007

Тем
66

Постов
196

Баллов
536
  • 26, Oct 2024
  • #25

КолдФьюжн, 277 байт

1

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

Протестировано локально на lucee-express-5.2.6.60.

 

Frenchfrost


Рег
01 Jan, 2011

Тем
65

Постов
184

Баллов
529
  • 26, Oct 2024
  • #26

Пакетная обработка Windows, 38 36 байт

6

Этот код создает файл с именем «q», содержащий букву «q», а затем добавляет его к исходному файлу.

Обратите внимание, что «::» — это псевдоним «rem», который не требует дополнительного места.

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

 

Kroldoctor


Рег
18 Sep, 2008

Тем
63

Постов
198

Баллов
583
  • 26, Oct 2024
  • #28
Бефунге-98 (PyFunge) 1603

, 22 19 байт

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

Добавляет < перед последним " в каждом поколении.

JstxJstx

<pre id=o></pre>

, 4 байта

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

Объяснение

s=`f=_=>"f=_"+f`; for(i=10;i--;s=eval(s)()) o.innerText+=s+"\n"; ||answer||

Подробный код:С (ГКК)

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

, 71 байт

На каждой итерации после закрывающей скобки основной функции добавляется точка с запятой.

 

Sansan


Рег
15 Jul, 2004

Тем
76

Постов
207

Баллов
607
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно