Квіне повільно зростає


30

Зробіть Квінку.

Здається, просто так? Ну а ця квітка повинна виводити себе плюс свій перший персонаж, який потім виводить себе плюс другий символ тощо.

Таким чином, квітка повинна в декількох поколіннях випустити два примірники.

Приклад: Дозволяє бути вашим кодом x . Запуск повинен вивести x + x[:1]. Запуск отриманої програми повинен виводити x + x[:2]і так далі ...

Якщо ваш код був foobar, запуск цього повинен вивести foobarf. Запуск цього повинен вивестиfoobarfo . І так далі, і далі за цією схемою:

foobar
foobarf
foobarfo
foobarfoo
foobarfoob
foobarfooba
foobarfoobar
foobarfoobarf

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


3
Я підозрюю, що цей виклик неможливий у більшості мов, враховуючи, що читання вихідного коду за замовчуванням заборонено.
Ørjan Johansen

12
@ ØrjanJohansen, а потім Денніс з'являється
Rod

2
@Rod Ну я не сказав , все це просто , що багато / більшість мов не мають очевидний спосіб додати довільні фрагменти коду до кінця таким чином , що (1) вона не дає синтаксичну помилку (2) Програма може виявити зміни.
Ørjan Johansen

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 Наскільки я можу сказати, ця відповідь та згенерований код - це повні програми. У mainР. немає будь-якої іншої обов'язкової структури, такої як, наприклад, питання прямо не вимагає повноцінної програми, тому функція чи подібне може виконуватись.
Steadybox

5

Аліса , 29 байт

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

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

Недрукований символ - 0x18.

Пояснення

Проблема зі звичайними "функціями Fungeoid quines полягає в тому, що якщо ми повторимо весь вихідний код, то ми також отримаємо додаткові, "і рядок більше не охоплює весь вихідний код. Я припускаю, що тому існуюча відповідь використовує 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__маркер ol ' дозволяє легко додати довільну рядок до будь-якої програми Perl, до якої основна програма може отримати доступ через <DATA>обробку файлів (і фактично використовуючи __END__, що робить те саме для зворотної сумісності, а не __DATA__економить два зайвих байта) .

Зауважте, що ця програма не читає власний вихідний код, а лише додаткові вхідні дані, додані до її джерела після __END__маркера. Насправді __END__маркер і все, що знаходиться після нього, функціонують як буквений рядок, що закінчується в кінці введення.

Також зауважте, що для того, щоб точно відповідати специфікації, ця програма повинна закінчитися в новому рядку. Якщо цього не відбувається, новий рядок фактично автоматично додається після другого __END__, але тоді перший вихід ітерації вже не буде точно рівний коду плюс його перший байт.


2

Befunge-98 , 30 байт

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

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

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


Ви можете в першому рядку відзначити, що це неконкуренція / обман, аби відмовитись від будь-яких потвор, які він інакше може отримати.
Кінтопія

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командний рядок.


Здається, це не працює, коли я спробую це в Інтернеті! , це просто звичайна королева.
Ørjan Johansen

@ ØrjanJohansen Ви повинні запустити його php -r 'command'.
jimmy23013

Га, не можу змусити його працювати. TIO, здається, просто ігнорує аргументи -r.
Ørjan Johansen


Ага. Я, мабуть, тоді щось зрозумів неправильно. Тепер мені вдалося змусити його працювати з PHP як мовою .
Ørjan Johansen

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.