Programa A :
"iQ ²¯24
G²õ@i'#+Xd"iQ ²¯24
G²õ@i'#+Xd
O programa B tem mais de 8kB, tanto que o link quebra, para não colar a coisa toda. Aqui está uma amostra:
#þ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#ÿ"iQ ²¯24
G²õ@i'#+Xd"iQ ²,#Ā"iQ ²¯24
G²õ@i'#+Xd"iQ ²
Não consegui encontrar uma maneira de fazer com que um NUL
byte funcionasse, e é por isso que o programa B possui apenas 255 caracteres únicos. O programa B consiste essencialmente em 255 cópias de um único programa, onde um único byte irrelevante é alterado a cada vez e as primeiras 254 execuções são ignoradas.
Para a explicação, começarei com esta versão simplificada de A para que o B resultante seja mais fácil de discutir.
"iQ ²¯23
3õ@i'#+Xd"iQ ²¯23
3õ@i'#+Xd
Este programa é baseado no jine japonês com capacidade de carga útil básica . A string no início contém uma duplicata do restante do programa, iQ ²
insere uma cotação e duplicatas para criar uma representação de string de todo o programa e, em seguida, ¯23
apara a si mesma e tudo o que está depois. A sequência resultante é um programa que gera o Programa A :
"iQ ²¯23
3õ@i'#+Xd"iQ ²
Vou me referir a essa string como U
.
A última linha de A duplica U
várias vezes com uma pequena alteração a cada vez. Especificamente, para cada número X
no intervalo, [1...3]
ele gera "#c" + U
onde c
está o caractere com o código X
. O comportamento padrão do Japt é gerar as strings sem aspas e separadas por vírgulas; portanto, essa é a saída do nosso A simplificado (observe que há um byte imprimível entre cada um #
e "iQ
:
#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²,#"iQ ²¯23
3õ@i'#+Xd"iQ ²
Vamos chamar isso de B simplificado .
B simplificado tem uma estrutura simples, alternando entre #c
e U
. Felizmente para esta resposta, cada um #c
e U
é tratado como separado por vírgula, e nessa situação o comportamento disso é tudo, exceto o último U
, não tem efeito na saída. A única parte do B simplificado que afeta a saída é esta:
"iQ ²¯23
3õ@i'#+Xd"iQ ²
O que é idêntico ao U
que já sabemos saídas A. simplificado
A única diferença entre A simplificado e o programa A é que, em vez de gerar cópias para o intervalo, [1...3]
o programa real gera cópias para o intervalo [1...256]
. Isso resulta em 256 versões de #c
cada uma delas com um caractere diferente, embora a última versão "Ā" seja um caractere de vários bytes, portanto, não adiciona nenhum bytes exclusivo, mas tudo, exceto o último, U
ainda é ignorado.