Автоцикл велосипед


11

Зробіть квінт, але з поворотом.

Заява

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

Приклад: Припустимо, що ваш код був foobar, запустивши його, він повернеться, oobarfщо буде іншою дійсною програмою.

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

Правила

  • Ваш код не повинен бути результатом якогось покоління чужого коду, що очевидно краде
  • Ваш код повинен містити більше 2 символів (так що короткий код не є задоволенням)
  • Ваш код повинен містити принаймні два різних символи (наприклад: +++недійсний)

Оцінка балів

Як виклик виграє найкоротший код.



3
@DomHastings У вас були місяці, щоб написати це.
mbomb007

2
@ IQuick143 Я думаю, що> 2 символи є гарною вимогою з тієї причини, яку ви вказали
dylnan

5
Буде чи це граф , як «обертається Куайна»? ; p
Кевін Круїссен

3
@ mbomb007 Пошук мови, якою це можливо, є частиною виклику
IQuick 143,

Відповіді:


19

Befunge-98 (PyFunge) , 2600 байт

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

Це зробити це було пекельним фестом.

Як це працює:
Програма являє собою купу викладених операторів, які збирають навколо себе програму B, яка потім друкує половину вихідного байта, зміщеного вдвічі.
Програма - це фактично 2 примірники 1300-байтної програми. Це гарантовано, що вся 1300-байтна програма завжди запускається в цілому.

Найкраще пояснення:
Кожен Befunge-98 Куайн повинно містити символи таких @або qй ,
Problem : Жоден з цих символів не є гарною відправною точкою Especialy , так @і qзавершувати роботу програми миттєво.
Рішення : Позбавтеся цих символів у вихідному коді

Проблема : як?
Рішення : Використовуйте p(покладіть) команди, щоб змінити вихідний код, щоб включити необхідні символи, які будуть друкувати вміст вихідного коду, зміщеного на один байт, а не використовувати gкоманду, що обманює.

Проблема : (зітхніть, коли це закінчиться)
Поставлена ​​команда вискакує 3 значення, n x yякі визначають символ, x-координату, y-координату, однак, коли ініціалізація цих значень розділена навпіл, вона може записувати погані символи в початковому вихідному коді, роблячи це марним для ангіни.
Рішення : (остання, яку я обіцяю)
Використовуйте 2 копії вихідного коду, остання - "правильна", це випадково виправляє іншу проблему, яка полягає в тому, що оператор put (команда p + постійні ініціалізатори), розділений навпіл, не виконується, це фіксується, маючи по 2 копії кожного заяви. Останнє, для чого потрібно працювати, - як ми робимо весь вихідний код із половини?

Відповідь :
Зображення вартує 1000 слів, які вони вимовляють.  Потім вони зробили Піт.

Це наочний доказ того, чому дві копії байта рядка зміщені == Дві копії байтового зміщеного рядка. Це означає, що ми можемо взяти половину коду, змінити байт, а потім надрукувати його двічі (АБО взяти половину коду, змінити байт, надрукувати, повторити [Ось що насправді відбувається])

Як це реалізується : Припустимо, джерело 0123456789abcdef є джерелом

Підключити псевдокод:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS означає стек друку (не справжня інструкція). Ми натискаємо половину вихідного коду назад на стек, використовуючи ""потім, ми друкуємо стек, а потім отримуємо ( 'командуємо) перший символ, 0який переміщуємо перед, 'і друкуємо його останнім, що викликає зсув байта, потім повторюємо цикл ще раз надрукувати другий примірник. Однією з технічних особливостей, з якою потрібно боротися, є символи всередині джерела, це може спричинити неприємності, якщо ми пишемо його під час виконання вихідного коду, я обійшов це, додавши більше викладених операторів, які турбуються про нього зовні.

Через це код виглядає приблизно так: Код

Пояснення :
Зелене виділення: Код, який забезпечує додавання символів до вихідних
сірих літер (пробачення поганої видимості вибачте): Код, який додається зеленим кодом
Червоне виділення: Код, який переміщує перший символ другої половини вихідного коду в область Синього .
Синій підсвічування: Див. Червоне виділення
Помаранчеве виділення: Код, який гарантує, що ми припиняємо після написання 2-х байт зміщених копій, додавши @команду (завершити) в Жовту область.

Стрілки повинні сподіватися, щоб було зрозуміліше, як йде потік коду.

Ось остання складна частина:
звідки беруться вихідні коди для дітей ?

Коротка відповідь: C # Magic
Довга відповідь: 100+ фрагменти коду Befunge, зроблені вручну, складені кодом C #. Я вручну написав близько 100 постійних ініціалізаторів (фрагмент коду befunge, який підштовхує певне число до стеку) вручну, а потім застосував користувальницьку програму C # для компіляції її до виходу Befunge 1300 байтів, який потім скопіював два рази і вставив остаточний програма.

Ви все ще тут? Велике спасибі за прочитане! (або принаймні прокручування до кінця)
Я сподіваюся, що мої погані жарти були веселими і не дратували.

Примітка: жоден оператор put у цьому коді не створює команду ag, яка була б обманом.

EDIT: Я підтвердив код за допомогою наведеного нижче коду Javascript у TIO, використовуючи інструменти для розробників

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

Я дуже з нетерпінням чекаю повного пояснення, але це здається цілком досягненням і, безумовно, заслуговує на винагороду!
Натаніел

1
@Nathaniel Існує повне сподівання, що сподобалось! : D
IQuick 143

1
Ця частина щодо боротьби pз неправильними аргументами - геніальна.
leo3065

@ leo3065 Дякую :)
IQuick 143,

@lQuick справді я це роблю!
Натаніель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.