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á, oobarf
que 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 código-golfe , o código mais curto vence.
Respostas:
Befunge-98 (PyFunge) , 2600 bytes
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
@
ouq
e,
Problema : Nenhum desses símbolos são um bom ponto de partida especialy desde
@
eq
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 og
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:
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 caractere0
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
fonte
p
argumentos incorretos é genial.