Sua tarefa é criar um programa que imprima sua própria fonte.
"Ei, nós já temos esse desafio e muitas variações! Por que você está fazendo outro?" você pode perguntar, mas este será um dos mais difíceis (espero, de qualquer maneira).
Seu quine deve ser "protegido por mutação", o que significa que, mesmo quando um de seus caracteres é duplicado no local, deve gerar o código-fonte do programa original.
Por exemplo, se você possui um quine (o exemplo a seguir não está escrito em nenhum idioma, é apenas pseudocódigo):
abcd
Todos esses programas devem gerar abcd
:
aabcd
abbcd
abccd
abcdd
(Em cada um desses programas, a
, b
, c
e d
são cada duplicada no local, o que significa que o personagem duplicado foi colocado logo após o caráter original.)
Regras:
- Aplicam-se regras padrão de quine.
- Um caractere de vários bytes conta como um caractere e o caractere não é "dividido" em seus respectivos bytes quando duplicado.
Isso é código-golfe , então o código mais curto em bytes vence!
fonte
0
e00
em CJam ambas as saídas0
.0
não é uma solução adequada.Respostas:
> <> , 56 bytes
Experimente online! ou verifique todas as mutações .
Como o programa original funciona (desatualizado)
O intérprete inicia na célula (0, 0) .
^
define a direção para cima , de modo que o ponteiro de instrução (IP) se agrupe na célula (0, 20) .'
ativa o modo de sequência: até que o próximo'
seja encontrado, todos os caracteres sob o IP são empurrados na pilha. O mesmo'
é encontrado novamente depois de envolver, então pressionamosO IP cai em (0, 19) , ainda subindo. A execução de
d3*}
push 13 = 0xd e , em seguida, 3 , multiplica os dois valores ( 39 / aspas simples ) e gira a pilha para a direita. Isso deixa a pilha da seguinte maneira.As próximas duas instruções (
^
) não fazem nada neste momento.:84*=
duplica a parte superior da pilha, pressiona 8 e 4 , multiplica-os ( 32 / espaço ) e testa o caractere duplicado quanto à igualdade com o espaço . Para o programa inalterado, isso sempre pressiona 0 .?
pula a próxima instrução se o topo da pilha for falso. Para o programa original, sempre é,~
sempre é ignorado.oao
aparece e imprime a parte superior da pilha, pressiona um avanço de linha 10 / e depois aparece e imprime o avanço de linha .Finalmente,
0f.
pula para a célula (0, 15) (a parte inferior^
), começando novamente com o próximo caractere na pilha.Quando a pilha estiver vazia, todo o código-fonte foi impresso.
:
falhará e o programa será encerrado.Como os programas alterados funcionam (desatualizados)
A duplicação de qualquer caractere que não seja de avanço de linha somente estenderá o programa horizontalmente. Como o programa é executado verticalmente, essas instruções extras nunca serão executadas.
A duplicação de qualquer avanço de linha antes do fundo
^
irá mudar as células (0, 14) e (0, 15) para (0, 15) e (0, 16) .0f.
agora pulará para a célula antes da base^
, que também é a^
, para que o programa não seja afetado pela mudança.Por fim, qualquer caractere de avanço de linha duplicado também alterará a sequência. As linhas curtas são preenchidas com espaços, então um espaço 32 / será inserido na posição do avanço de linha. pressionará 1 por espaço, para não pular a próxima instrução. Nesse caso, aparece e descarta o espaço ; portanto, o seguinte imprime o caractere acima do espaço .
84*=
?
~
o
fonte