Медленно растущий Куайн


30

Сделать Куайн.

Кажется, легко, правда? Ну, эта квинна должна выводить себя плюс свой первый символ, который затем выводит себя плюс свой второй символ и так далее.

Таким образом, Quine должен в нескольких поколениях вывести две копии.

Пример: пусть ваш код будет x. Запуск это должно вывести x + x[:1]. Запуск результирующей программы должен вывести x + x[:2]и так далее ...

Если ваш код был foobarзапущен, это должно вывести foobarf. Выполнение этого должно вывести foobarfo. И так далее и тому подобное, следуя этой схеме:

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

Ваша Программа должна быть длиннее 2 байт и должна выводить только ОДИН дополнительный символ своего кода на каждую итерацию.


3
Я подозреваю, что эта проблема невозможна в большинстве языков, учитывая, что чтение исходного кода запрещено по умолчанию.
Орджан Йохансен

12
@ ØrjanJohansen, а затем появляется Деннис
Род

2
@Rod Хорошо, я не сказал все , просто у многих / большинства языков нет очевидного способа добавить произвольные фрагменты кода в конец таким образом, что (1) это не дает синтаксической ошибки (2) Программа может обнаружить изменение.
Орджан Йохансен

3
Так как это очень необычная морская яма, все еще запрещены обычные лазейки?
Драконис

Ответы:


15

Зш ,110 108 100 байт

a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}
a=`<&0`<<''<<<t;b=${a:0:50};printf $b$b${a:0:-50}

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

Так что можно.

объяснение

a=`<&0`<<''<<<t;       # Set A to everything following this line, until eof or
                       #   an empty line (which never happens before eof) encountered.
                       # A "t" is appended to prevent automatic trimming of newlines.
b=${a:0:50};           # Set B to the first line.
printf $b$b${a:0:-50}  # Print two copies of B and
                       #   A with 50 trailing characters removed.


11

R, 289 байт

s<-c("s<-", "i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#")
i=get0('i',ifnotfound=0)+1;p=paste0(s,substr(get0('p',ifnotfound=s),1,i),collapse='');cat(s[1]);dput(s);cat(paste0(s[2],substr(p,1,i)))#

Отдайте должное этому вдохновителю. Работает только в том случае, если работает в той же среде R, что и предыдущий quine.


объяснение будет получено ... Я еще не проверял его 288 раз, но я вполне уверен, что это правильно
Джузеппе

Это должно быть 289 байт, так как quine добавляет туда символ новой строки, но в любом случае здорово, что вы решили это!
IQuick 143

ах, вы правы, глупо catдобавлять новые строки.
Джузеппе

Но это полная программа? Являются ли сгенерированный код полными программами?
jimmy23013

@ jimmy23013 Насколько я могу судить, этот ответ и сгенерированный код являются полными программами. В mainR. нет или какой-либо другой обязательной структуры, подобной этой. Кроме того, в этом вопросе явно не задается полная программа, поэтому сработала бы функция или подобное.
Steadybox

5

Алиса , 29 байт

4P.a+80pa2*&wdt,kd&w74*,.ok@

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

Непечатный символ 0x18.

объяснение

Проблема с обычными "quine Fungeoid на основе состоит в том, что если мы повторим весь исходный код, то мы также получим дополнительные, "и строка больше не будет охватывать весь исходный код. Я предполагаю, что именно поэтому в существующем ответе используется чит- gподход.

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

Общая идея заключается в том, что мы создаем представление всего исходного кода в стеке, но только циклически перебираем первые 29 символов (т. Е. Длину программы) с длиной цикла, определяемой размером кода. Таким образом, мы можем добавить произвольные символы (кроме перевода строки) после, @и результатом всегда будет циклическое повторение основной программы, на один символ длиннее исходного.

4P   Push 4! = 24. This is the code point of the unprintable, which we're 
     using as a placeholder for the quote.
.a+  Duplicate it and add 10, to get 34 = '"'.
80p  Write '"' to cell (8,0), i.e. where the first unprintable is.
    Placeholder, becomes " by the time we get here, and pushes the code
     points of the entire program to the stack. However, since we're already
     a good bit into the program, the order will be messed up: the bottom
     of the stack starts at the 24 (the unprintable) followed by all 
     characters after it (including those from extraneous repetitions). Then 
     on top we have the characters that come in front of the `"`. 
     So if the initial program has structure AB, then any valid program has
     the form ABC (where C is a cyclic repetition of the initial program),
     and the stack ends up holding BCA. We don't care about C, except to
     determine how big the program is. So the first thing we need to do is
     bring B to the top, so that we've got the initial program on top of
     the stack:
a2*  Push 10*2 = 20.
&w   Run the following section 21 times, which is the length of B.

  dt,  Pull up the value at the bottom of the stack.

k    End of loop.
d&w  Run the following section D+1 times, where D is the length of ABC.

  74*  Push 28, one less than the number of characters in AB.
  ,    Pull up the 29th stack element, which is the next character to print.
  .o   Print a copy of that character.

k    End of loop.
@    Terminate the program.

Отличное решение. Мне нравится объяснение.
IQuick 143

4

Perl 5 , 83 байта (включая последний перевод строки)

$_=q($/=$;;$_="\$_=q($_);eval
__END__
".<DATA>;print$_,/(.).{82}\z/s);eval
__END__

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

Хороший старый __DATA__токен позволяет легко добавлять произвольную строку в любую Perl-программу, к которой основная программа может затем обращаться через <DATA>дескриптор файла (и фактически использует __END__, что делает то же самое для обратной совместимости, вместо того, чтобы __DATA__сохранять два дополнительных байта) ,

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

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


2

Befunge-98 , 30 байт

0>:#;0g:840#;+*#1-#,_$a3*%0g,@

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

Моя попытка использовать Befunge-98, который использует квинус с пробелом, который также подсчитывает, сколько символов было выдано. Однако использует ли gкоманда.


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

2

PHP, 146 байт

ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>ob_start(function($s){return($u=substr($s,0,73)).$u.substr($s,0,-72);})?>

Он должен быть запущен с помощью -rкомандной строки.


Кажется, не работает, когда я попробую онлайн! Это просто обычная мука.
Орджан Йохансен

@ ØrjanJohansen Вы должны запустить его с php -r 'command'.
jimmy23013

Гах, не могу заставить его работать. TIO, похоже, просто игнорирует аргументы -r.
Орджан Йохансен


Ага. Должно быть, я тогда что-то неправильно понял. Теперь мне удалось заставить его работать с PHP в качестве настройки языка .
Орджан Йохансен

2

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

803X4+kw.'.q}͍}͍}͍}͍}͍}͍}͍}͍}͍::l͍5X-:}-$:l͍{-1--@

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

Использует подход, аналогичный ответу Алисы: рефлексивно записывает строковую "команду в код, так что есть только один. Остальное - много манипуляций со строками и стеками, чтобы восстановить исходную программу, сколько дополнительных байтов необходимо, и вывести необходимые фрагменты.

Последовательность вращает строковое представление в памяти вокруг так , что 803X4+kwпоявляется в начале , а не в конце, из - за позиции из "и не существует простой способ обработки этой операции без необходимости вычислять много неудобных числа ,

Хотя исходная программа имеет длину 61 байт, ее длина строки составляет всего 50, что легко построить, 5Xи было лишь совпадением, что ее не нужно дополнять после того, как она содержит все необходимые функции (например, программа длиной 49 будет проще кодировать как 50с одним байтом заполнения, чем кодировать литерал 49, в то время как 51будет кодироваться как 5X3+или 53, с учетом его собственных дополнительных байтов).

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