Auto cycler quine


11

Faça um quine, mas com uma torção.

Declaração

O quine imprime seu código, mas coloca seu primeiro caractere no final.
(Você pode fazer isso ao contrário, mas incluir essa nota na sua resposta)
A saída deve ser um programa que também é uma solução.

Exemplo: suponha que seu código seja foobar, executá-lo retornará, oobarfque será outro programa válido.

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

Regras

  • Seu código não deve ser uma saída de alguma geração do código de outra pessoa que obviamente está roubando
  • Seu código deve ter mais de 2 caracteres (o código curto não é divertido)
  • Seu código deve conter pelo menos dois caracteres diferentes (ex: +++não é válido)

Pontuação

Como um desafio de , o código mais curto vence.



3
@DomHastings Você teve meses para postar isso.
mbomb007

2
@ IQuick143 Acho> 2 caracteres é um requisito bom para a razão que você disse
dylnan

5
Será que esta contagem como um "Quine rotativa? ; p
Kevin Cruijssen

3
@ mbomb007 encontrar uma linguagem que isso é possível em uma parte do desafio
iQuick 143

Respostas:


19

Befunge-98 (PyFunge) , 2600 bytes

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 qe ,
Problema : Nenhum desses símbolos são um bom ponto de partida especialy desde @e qterminar o programa imediatamente.
Solução : Livre-se desses caracteres no código-fonte

Problema : Como?
Solução : Use os pcomandos (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 gcomando que está trapaceando.

Problema : (suspira quando isso terminará)
Um comando put exibe 3 valores n x yque 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 :
Uma imagem vale mais que mil palavras.  Então eles fizeram Piet.

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 0que 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: Código

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

Estou realmente ansioso pela explicação completa, mas isso parece uma conquista e certamente merece a recompensa!
Nathaniel

1
@ Nathaniel Lá vai a explicação completa espero que você goste! : D
IQuick 143

1
Essa parte de lidar com pargumentos incorretos é genial.
Leo3065 # 6/18

@ leo3065 Obrigado :)
IQuick 143

@lQuick realmente eu faço!
Nathaniel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.