7 , 2 bytes
7 usa um conjunto de caracteres de 3 bits, mas recebe a entrada compactada em bytes (e de acordo com a meta, os idiomas com conjuntos de caracteres de sub bytes são contados usando bytes para o arquivo no disco ). Aqui está um xxd
despejo do programa:
00000000: 4cf4 L.
Ao fornecer esse arquivo para o 7 intérprete, ele produzirá o seguinte programa:
00000000: 4fa6 7f O..
que, por sua vez, produzirá o programa original novamente.
Então, o que está acontecendo aqui? Não há leitura da fonte envolvida (na verdade, não acho que seja possível ler a fonte no 7), embora o programa esteja enganando de outra maneira; Diz-me o que pensas. Veja como o programa funciona. (Observe que cada comando 7 tem duas variantes, algumas das quais não têm nomes e não podem aparecer no programa original. Existem doze comandos no total, em seis pares. Estou usando negrito para comandos ativos, não-negrito para passivo comandos, e nos casos em que o comando ativo não tem nome, eu estou dando o mesmo nome que o comando passivo correspondente e confiando no negrito para distinguir.No caso em que ambos são nomeados, por exemplo, 7
qual é a variante ativa de 1
, cada comando recebe seu próprio nome e o negrito é apenas o destaque da sintaxe.)
231 7 23 Programa original, descompactado em octal
231 Empurre 237 para a pilha
23 Empurre 23 para a pilha
(implícito) anexa uma cópia da parte superior da pilha ao programa
2 Parte superior duplicada da pilha (atualmente 23 )
3 Parte superior da saída, segundo elemento pop da pilha
Nesse ponto, o 7 intérprete vê que o topo da pilha contém comandos ( 2
e 3
) que não são representáveis; portanto, ele escapa do topo da pilha, produzindo 723
(o que é). A primeira saída de comando seleciona o formato de saída; neste caso, é o formato 7, "formate a saída da mesma maneira que o programa". Portanto, os comandos são compactados em bytes. Então o programa continua:
231 7 23 23
(implícito) anexa uma cópia da parte superior da pilha ao programa
2 Parte superior da pilha duplicada (atualmente 237 )
3 Parte superior da pilha, pop o segundo elemento da pilha
7 Empurre um elemento vazio na pilha
Neste ponto, não há nada além de elementos de pilha vazios na pilha, portanto o programa é encerrado. Nós produzimos 23
mais cedo. Se escaparmos 237
(e precisarmos, porque ele contém comandos irrepresentáveis), obtemos 7231
. Isso obtém a saída diretamente, produzindo a saída final do programa 237231
(formatada da mesma maneira que o programa, ou seja, compactada em bytes). É isso 4fa67f
. (Pode-se notar que isso 1
foi totalmente inútil em termos de afetar a saída; a única razão para existir é fazer os dois programas diferentes.)
A corrida 237231
ocorre quase exatamente da mesma maneira; a diferença é que o inútil 1
é executado logo após a primeira impressão (e o elemento vazio é excluído implicitamente na segunda vez que o final do programa é atingido). Mais uma vez, as 231
extremidades até a saída de si, as 23
extremidades até a saída de si precedido por um 7
, e nós temos 231723
, o programa original.
O observador pode observar que os dois programas, apesar de terem o mesmo comprimento no octal "nativo" do idioma, têm comprimentos diferentes no disco. Isso ocorre porque um programa 7 pode ser preenchido com um número arbitrário de 1 bits, e o formato compactado descarta o preenchimento à direita. Veja como a codificação acontece:
2 3 1 7 2 3
010011001111010011(1...)
4 c f 4 padding
Em outras palavras, dois bytes, 4C
F4
são suficientes para representar o programa, então foi tudo o que usei.