n-level Ouroboros Quine


11

Ця 128-мовна quine ouroboros (програма, яка виводить програму іншою мовою, яка виводить програму ще однією мовою (125 мов пізніше), яка виводить оригінальну програму) є досить вражаючою. Але, на жаль, він має статичну кількість ітерацій.

Напишіть програму, яка виводить програму (не обов'язково іншою мовою, але це може бути), яка виводить програму, яка виводить програму тощо, яка після n ітерацій виводить оригінальну програму вперше (тобто немає проміжних Програма повинна бути такою ж, як і вихідна, тому що в іншому випадку функціонує квітка, яка ігнорує її введення), де n - негативне ціле число, яке надається як вхід. Вхід не може бути лише номером у вихідному вихідному коді (наприклад, розміщення x = <the value of n>на початку вашої програми), він повинен бути одним із наступних:

  1. Передано як аргумент командного рядка
  2. Читати зі стандартного введення
  3. Передано як аргумент функції, яка повертає / виводить нову програму.

Для проміжних етапів в ouroboros ваша програма може бути або повністю функціонуючою програмою, або функцією без аргументів, яка при виклику поверне / виведе наступну.

Ви не можете читати з самого вихідного файлу або використовувати будь-які вбудовані подібні квітами (я не думаю, що таких було б, але це може бути)

Щоб було зрозуміло, якщо n = 0програма повинна вивести власний вихідний код.

Якщо n = 1програма повинна вивести іншу програму, яка виводить вихідний вихідний код.

І так далі...

Найменше байт виграє!

Редагувати:

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



Чи можемо 1 індекс n? Отже n = 1 означає вихідний код друку, n = 2 означає код друку, який буде друкувати вихідний код тощо.
Термін дії даних закінчився

1
Чи будуть версії ітерації ще мати початковий внесок? Отже, скажімо, мій перший вхід - 3, і я запускаю програму, яку він виводить. Чи все ще буде вхід 3, або взагалі немає вводу? Якщо введення немає, я думаю, нам потрібно це впоратися, якщо щось подібне getInput()використовується без будь-якого введення. Або ми можемо сказати, введіть щось випадкове, яке не використовується для пізніших ітерацій, щоб запобігти помилкам для getInput()? Ака чи справжня відповідь Python?
Kevin Cruijssen

Я підозрюю, що те, про що ми просимо, - це, з огляду на ціле число n, вивести програму, яка є "початковою програмою" івротерапії quine nітерацій, і що наша відповідь не повинна вважатися однією з nітерацій. Це правильно?
Ерік Аутгольфер

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

Відповіді:


5

05AB1E , 28 байт

-4 байти + виправити завдяки Кевіну Крейсейну

"34çìD«s<©di®ì"34çìD«s<©di®ì

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


Пояснення

Це працює, додавши решту номер для друку на передню частину коду, а це означає, що він додається до стека так само, як і введення. У базовому випадку введення "0" він не об'єднує 0 на передній частині.


dє негативним ( >=0) замість позитивного ( >0). Проблема полягає в тому, що для перевірки, dне вискочивши її, потрібно спершу дублювати її, але потім її також слід відкинути під час ітерації 0"quinsting", інакше вона виведе дублювання 0. :(
Кевін Круїссен

"34çìD«s<©di®ì"34çìD«s<©di®ìна 28 байт, можливо (що все ще досить близько до наміченого підходу)? (Я боюся, що ваша поточна версія для ітерації 0"34çìD«s<Ddiì"34çìD«s<Ddiìвиходить -1з Dверхніх копій ..)
Кевін Круїйсен

4

Рунічні чари , 39 байт

"3X4+kSql1=c*?S:1-}C'LA-}!i:0)2*?~!'´@

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

Буде на 4 байти коротшим, ніж 05AB1E, використовуючи ту саму тактику, якщо входи, де менше або дорівнює 10. Але оскільки нам потрібно підтримувати довільно великі значення, це стає складнішим.

Числове значення nрозміщується в передній частині та аналізується як безперервне буквальне число за допомогою ´. "3X4+kSqє основним кодом квінти. Якщо спереду немає значення, довжина стека буде лише 1 (квінка), інакше 2 дозволяють l1=d*?визначити, як поводитися з речами звідти.

  • Якщо є значення, S:1-}'LA2+-}виконайте: поміняйте значення на вершину, відніміть 1, дублюйте її, залишивши копію в нижній частині стека, отримайте Журнал 10 цього значення разів 100 (в результаті виходить власна довжина символу значення плюс 1 для ´), видаліть з кінця рядка таку кількість символів (фактично обрізаючи її з кінця, як там, де вона не потрібна, так і тому, що вона має неправильне значення). Cє на один байт коротшим 2+та призводить до того ж значення.

  • Якщо немає значення, прочитайте його з введення.

Незалежно: :0)2*?дублювати та порівнювати з нулем.

  • Якщо не нульовий поштовх ´.

  • Якщо нуль, виведіть значення. Ми можемо обдурити, використовуючи !замість цього 2?і зберегти байт, тому що, коли ´намагається виконати перший байт, він бачить, що він не є числовим і одразу випадає з режиму числення в тій же позиції.

Роздрукуйте всю стеку зверху вниз.


3

Java 10, 145 байт

n->{Long N=n;var s="n->{Long N=%s;var s=%c%s%2$c;return s.format(s,N>0?N-1+%2$cL%2$c:%2$cn%2$c,34,s);}";return s.format(s,N>0?N-1+"L":"n",34,s);}

Спробуйте в Інтернеті і подивіться результати деяких ітерацій .

Пояснення:

пояснення :

  • var sМістить вихідний код Неформатована
  • %s використовується для того, щоб поставити цю струну в себе s.format(...)
  • %c, %1$cі 34використовуються для форматування подвійних лапок
  • s.format(s,34,s) зводить це все разом

Частина виклику:

Перша лямбда-функція приймає longвхід як параметр.

  • Це встановлюється змінною Long N=n;в першій ітерації. Або Long N=%s;для наступних ітерацій.
  • Потрійна перевірка N>0?N-1+"L":"n"заповнить це %sзначенням N-1, доданим, Lоскільки воно є довгим, і перетворить його в String для %s, якщо Nвоно більше ніж 1. Якщо Nнатомість 0 (початковий ввід був 0або це остання ітерація переписки- ' цикл '), він замість цього заповнить %sпочаткове n.

Специфікація каже, що проміжні виходи повинні бути повноцінною програмою або функцією без аргументів
Втілення Незнання

@EmbodimentofIgnorance Я знаю, це те, що я маю. Перша лямбда-функція приймає longпараметр функції, а інші лямбда-функції приймають невикористаний Voidпараметр , який я завжди використовую для завдань, заявляючи, що не брати вхід, оскільки v->на 1 байт коротший ()->.
Kevin Cruijssen

2

Haskell , 195 164 байт

main=putStr(x++show x++"\na=")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr
x="main=putStr(x++show x++\"\\na=\")>>(getLine:cycle[pure$show$a-1])!!a>>=putStr\nx="
a=0

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

Для цього використовується досить проста техніка quine. Ми змінюємо його змінною, aяка встановлюється на число. Якщо це число дорівнює нулю (що це на початку), ми беремо вхід і виводимо наше джерело з aвстановленим на вхідне число. Якщо aне дорівнює нулю, ми виводимо джерело aна один менший. Цей спосіб aвідлічується до нуля до виведення вихідного джерела.




1

Perl 6 , 44 байти

<say '<',S{\d+}=get||0-1,'>~~.EVAL'>~~.EVAL

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

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


1

C # (Visual C # Interactive Compiler) , 112 байт

void f(int n=-1){var s="void f(int n={2}){{var s={0}{1}{0};Write(s,(char)34,s,n-1);}}";Write(s,(char)34,s,n-1);}

Збережено багато байтів завдяки @NickKennedy!

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


Проміжні виходи не є ні повноцінною програмою, ні функцією, яка приймає єдиний аргумент. Крім того, я думаю, у вас є деякі ns, які повинні бути ls. Як щодо tio.run/##Sy7WTS7O/P@/…
Нік Кеннеді

1

Python 3.8 (передвипуск) , 60 56 55 53 байт

lambda n=-1,s='lambda n=%d,s=%r:s%%(~-n,s)':s%(~-n,s)

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

-2 байти завдяки Джо Кінгу

Станом на 53-байтну версію, також працює в Python 2 та Python 3.


Проміжна функція, здається, не є повноцінною програмою або функцією, яка не бере аргументів.
Нік Кеннеді

Цей оператор моржів :=є бажаним доповненням до Python, це точно.
mbomb007

"Для проміжних етапів в ouroboros ваша програма може бути або повністю функціонуючою програмою, або функцією без аргументів , яка при виклику поверне / виведе наступну."
mbomb007

@ NickKennedy Оновлено, щоб відповідати специфікації, і збіг випадково зберег 4 байти.
негативна

1
53 байти без використання:=
Jo King
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.