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 xxddespejo 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, 7qual é 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 ( 2e 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 23mais 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 1foi totalmente inútil em termos de afetar a saída; a única razão para existir é fazer os dois programas diferentes.)
A corrida 237231ocorre 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 231extremidades até a saída de si, as 23extremidades 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 F4são suficientes para representar o programa, então foi tudo o que usei.