Самозростаючий код кодею codeee codeeee


41

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

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

Ланцюжок програм повинен проходити нескінченно або до місця, де перекладач більше не може працювати (але повинен залишатися як теоретично вірною програмою на мові)

Правила

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

Виграє найкоротша програма 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 квінт чи ні, оскільки вона розширює межу різними способами.) Можна зробити гідний аргумент, що 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*)<$>.
Ørjan Johansen





4

мозковий ебать , 420 байт

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

Спробуйте в Інтернеті!

Це модифікація на "стандартній" Quine BrainFuck , з a .в кінці, яка враховує додаткову .кожну ітерацію.

Сам quine кодує символи 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-байтна версія, безумовно, недійсна.
Ерік Аутгольфер

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

Attache , 76 72 61 байт

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

Спробуйте в Інтернеті!

Стандартна квітка, яка додає пробіл до кінця 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]]

тощо.

Attache, 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

Хаскелл , 88 байт

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

Спробуйте в Інтернеті! Зростає, додаючи #до рядка даних.


Ви можете трохи заощадити, використовуючи showбільше, ніж просто рядок та використовуючи відповідність шаблонів. Спробуйте в Інтернеті!
Ørjan Johansen

@ ØrjanJohansen Приємно! За винятком базового стандарту Haskell quine, це зовсім інший підхід, тому сміливо розміщуйте його самостійно.
Лайконі

Гаразд, якщо ви так думаєте.
Ørjan Johansen

1

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

"34s+cTZL"34s+cTZL

Запустіть і налагодіть його

Створює додатковий пробіл перед другим лапкою кожної ітерації.

Пояснення

Використовує програму "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

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

":r2ssH

Спробуйте в Інтернеті! Спробуйте в Інтернеті !! Спробуйте в Інтернеті !!!

Це проста версія звичайного Gol> <> quine, але додає копію 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.