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>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Experimente online!
Fazer isso foi uma festa do inferno.
Como isso funciona:
O programa é um monte de instruções put que montam um Programa B em torno de si e depois imprimem metade do byte de origem alterado duas vezes.
O programa é na verdade 2 cópias de um programa de 1300 bytes, para garantir que todo o programa de 1300 bytes seja executado sempre como um todo.
Melhor explicação:
Cada Befunge-98 Quine precisa conter símbolos, um @
ou q
e ,
Problema : Nenhum desses símbolos são um bom ponto de partida especialy desde @
e q
terminar o programa imediatamente.
Solução : Livre-se desses caracteres no código-fonte
Problema : Como?
Solução : Use os p
comandos (put) para modificar o código-fonte para incluir os caracteres necessários que imprimirão as contenções do código-fonte deslocadas em um byte e não use o g
comando que está trapaceando.
Problema : (suspira quando isso terminará)
Um comando put exibe 3 valores n x y
que determinam o caractere, x-coord, y-coord, no entanto, quando a inicialização desses valores é dividida ao meio, ele pode escrever caracteres ruins no código-fonte inicial, tornando-o inútil para citar.
Solução : (último prometo)
Use 2 cópias do código-fonte, sendo o último o "correto", isso acidentalmente corrige outro problema: uma declaração put (comando p + inicializadores constantes) dividida ao meio Para não ser executado, isso é corrigido com 2 cópias de cada instrução. A última coisa que isso precisa funcionar é como criamos o código-fonte inteiro pela metade?
Resposta :
Essa é uma prova visual do motivo pelo qual duas cópias de um byte de string foram deslocadas == Duas cópias de uma string de byte shift. Isso significa que podemos pegar metade do código, byte shift e imprimi-lo duas vezes (OU pegar metade do código, byte shift, imprimir, repetir [Isso é o que realmente acontece])
Como isso é implementado : Suponha que 0123456789abcdef seja a fonte
Pseudocódigo Befunge:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS significa Pilha de Impressão (não é uma instrução real). Empurramos metade do código-fonte ao contrário na pilha ""
, imprimimos a pilha e, em seguida, buscamos ( '
comando) o primeiro caractere 0
que movemos à frente do '
e imprimimos por último, causando a troca de bytes, depois repetimos o ciclo mais uma vez para imprimir a segunda cópia. Um aspecto técnico a ser tratado são os símbolos dentro da fonte; isso pode causar problemas se o escrevermos durante a execução do código-fonte. Eu contornei isso adicionando mais instruções put que cuidam dele externamente.
Isso faz com que o código se pareça com isso:
Explicação :
Destaque em verde: Código que cuida da adição de caracteres na fonte
Letras cinzentas (prova a falta de visibilidade): Código que é adicionado pelo código verde
Destaque em vermelho: Código que move o primeiro caractere da segunda metade do código-fonte para a área Azul .
Destaque em azul: consulte Destaque em vermelho Destaque em
laranja: Código que garante a finalização após a gravação de cópias deslocadas de 2 bytes, colocando um @
comando (finalizar) na área amarela.
Esperamos que as setas tornem mais claro como o fluxo de código vai.
Aí vem a última parte difícil: de
onde vem o código-fonte dos bebês ?
Resposta curta: C # Magic
Resposta longa: 100+ trechos de código Befunge feitos à mão compilados por código C #. Eu escrevi manualmente cerca de 100 inicializadores constantes (um pedaço do código befunge que empurra um certo número para empilhar) manualmente e depois usei um programa C # personalizado para compilá-lo na saída Befunge de 1300 bytes, que copiei colei duas vezes e fiz a final programa.
Você ainda está aqui? Muito obrigado pela leitura! (ou pelo menos rolando até o fim)
Espero que minhas piadas ruins sejam divertidas e não irritantes.
Nota: Nenhuma instrução put neste código cria um comando ag que seria trapaça.
EDIT: Verifiquei o código usando o seguinte código Javascript no TIO usando ferramentas de desenvolvedor
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);