Quine endurecido por mutação

14

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, ce dsã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 é , então o código mais curto em bytes vence!

clismique
fonte
Isso conta? 0e 00em CJam ambas as saídas 0.
geokavel
Não, 0não é uma solução adequada.
Dennis
2
Eu acho que seria muito interessante como boliche de código
Sr. Xcoder 15/07/17
O problema da mutação de código é solucionável em geral? a menos que a mutação aconteça com um caractere dentro de uma cadeia de caracteres citada, ela geralmente corromperá o programa.
Hasen
O título não é um pouco enganador? "Mutação" sugere alterar um personagem, não repeti-lo
Luis Mendo

Respostas:

18

> <> , 56 bytes

^
.
+
8
f
0
o
a
o
~
:
?
~
:
?
:
-
*
4
8
:
^
^
}
*
3
d
'

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 pressionamos

d3*}^^:84*=?~oao0f.^

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

'd3*}^^:84*=?~oao0f.^

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.

oaoaparece 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

Dennis
fonte
Você pode duplicar qualquer nova linha e ela ainda funcionará.
Dennis
3
Ah, eu não li o post direito: P (Droga Dennis, por que você é tão bom)
clismique
4
Rachado.
jimmy23013
@ jimmy23013 Deve ser corrigido.
Dennis19