Авто Велосипед Куайн


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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

Это делает это был адский праздник.

Как это работает:
Программа представляет собой набор операторов 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 копий каждого оператора. Последнее, что нужно для работы, это как сделать весь исходный код из половины?

Ответ :
Говорят, что изображение стоит 1000 слов.  Затем они сделали Пит.

Это наглядное доказательство того, почему две копии строки сдвинуты в байтах == Две копии строки сдвинуты в байтах. Это означает, что мы можем взять половину кода, сдвинуть его по байтам, а затем распечатать дважды (ИЛИ взять половину кода, сдвинуть его по байтам, напечатать, повторить [Вот что на самом деле происходит])

Как это реализовано : Предположим, 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);

Я действительно с нетерпением жду полного объяснения, но это похоже на достижение и, безусловно, заслуживает награды!
Натаниэль

1
@Nathaniel Там идет полное объяснение, надеюсь, вам понравится! : D
IQuick 143

1
Эта часть о работе pс неверными аргументами гениальна.
leo3065

@ leo3065 Спасибо :)
IQuick 143

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