> <> , 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.
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
0
e00
em CJam ambas as saídas0
.