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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Попробуйте онлайн!
Это делает это был адский праздник.
Как это работает:
Программа представляет собой набор операторов put, который собирает вокруг себя Программу B, которая затем печатает половину исходного байта, сдвинутого дважды.
Программа на самом деле представляет собой 2 копии 1300-байтовой программы, так что гарантируется, что вся 1300-байтовая программа всегда запускается целиком.
Лучшее объяснение:
Каждый Befunge-98 Куайн должно содержать символы таких @
или q
и ,
Problem : Ни один из этих символов не являются хорошей отправной точкой Especialy , так @
и q
завершать работу программы мгновенно.
Решение : избавиться от этих символов в исходном коде
Проблема : как?
Решение : используйте p
(вставьте) команды, чтобы изменить исходный код, включив в него необходимые символы, которые будут печатать содержимое исходного кода, сдвинутого на один байт, и не использоватьg
команду, которая обманывает.
Проблема : (вздохните, когда они закончатся)
Команда put выдает 3 значения, n x y
которые определяют символ, x-координату, y-координату, однако, когда инициализация этих значений делится пополам, она может записывать неверные символы в исходном коде, что делает ее бесполезной для quining.
Решение : (последний, который я обещаю)
Используйте 2 копии исходного кода, причем последний является «правильным», это случайно решает другую проблему, заключающуюся в том, что оператор put (команда p + инициализаторы констант), разделенный пополам, не выполняется, это исправлено наличием 2 копий каждого оператора. Последнее, что нужно для работы, это как сделать весь исходный код из половины?
Ответ :
Это наглядное доказательство того, почему две копии строки сдвинуты в байтах == Две копии строки сдвинуты в байтах. Это означает, что мы можем взять половину кода, сдвинуть его по байтам, а затем распечатать дважды (ИЛИ взять половину кода, сдвинуть его по байтам, напечатать, повторить [Вот что на самом деле происходит])
Как это реализовано : Предположим, 0123456789abcdef является источником
Псевдокод Befunge:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS означает Print Stack (не настоящая инструкция). Мы помещаем половину исходного кода обратно в стек, используя ""
затем мы печатаем стек и затем выбираем ( '
команду) первый символ, 0
который мы перемещаем перед, '
и печатаем его последним, что вызывает сдвиг байтов, затем мы повторяем цикл еще раз, чтобы напечатать второй экземпляр. Одна техническая проблема, с которой нужно иметь дело - это символы внутри исходного кода, это может вызвать проблемы, если мы напишем его во время выполнения исходного кода, я обошел это, добавив больше выражений put, которые позаботятся об этом внешне.
Это заставляет код выглядеть примерно так:
Объяснение :
Зеленая подсветка: код, который заботится о добавлении символов в исходный
текст. Серые буквы (из-за плохой видимости, извините): код, который добавляется зеленым кодом.
Красная подсветка: код, который перемещает первый символ второй половины исходного кода в синюю область. ,
Синяя подсветка: см. Красная подсветка
Оранжевая подсветка: код, который гарантирует, что мы завершим работу после того, как мы записали 2-байтовые смещенные копии, поместив @
команду (завершение) в желтую область.
Надеемся, что стрелки должны прояснить, как проходит поток кода.
Вот последняя трудная часть:
откуда взялся исходный код детей ?
Краткий ответ: C # Magic
Длинный ответ: 100+ фрагментов кода Befunge, сделанных вручную, скомпилированных кодом C #. Я вручную написал около 100 константных инициализаторов (фрагмент кода befunge, который помещает определенное число в стек) вручную, а затем использовал специальную программу на C # для компиляции ее в 1300-байтовый вывод Befunge, который я затем скопировал, вставил дважды и сделал финальный программа.
Ты все еще здесь? Большое спасибо за чтение! (или хотя бы прокрутить до конца)
Надеюсь, мои плохие шутки были веселыми и не раздражающими.
Примечание. В этом коде оператор put не создает команду ag, которая будет обманывать.
РЕДАКТИРОВАТЬ: я проверил код, используя следующий код Javascript в TIO, используя инструменты разработчика
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);