Este programa é cheio de caracteres não imprimíveis, então aqui está um hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Nota: isso usa uma rotina de entrada numérica que é incapaz de inserir números negativos; portanto, esse envio é restrito apenas a números inteiros não negativos.
Um problema com desafios de policiais e ladrões é que você não escreve explicações sobre o código (para dificultar o crack). Por outro lado, isso significa que não preciso me preocupar com o problema aqui.
Escolhi 7 como idioma porque, especialmente em sua notação compactada, é muito difícil de ler e não vejo por que deveria ser apenas eu quem precisava se dar ao trabalho de mover em pedaços de programas de 8 bits escritos em uma codificação de 3 bits. Boa sorte!
Explicação
Agora que o programa foi quebrado (por força bruta, infelizmente; isso sempre é um perigo nessas breves soluções), também posso explicar o que estava fazendo. Isso era realmente bastante solucionável ao ler o programa; Eu poderia ter dificultado muito, mas isso me pareceu uma péssima idéia quando existem brechas de força bruta.
Começaremos representando o programa em uma codificação mais natural. Como de costume, os números em negrito indicam os comandos que são executados imediatamente (não todos os quais são representável em um programa; 6
e 7
são, mas 2
para 5
que não são), números unbolded representam seus equivalentes escaparam ( 0
a 5
, todos os quais são representável no programa original; nota que 0
é um escape 6
e 1
é um escape 7
):
112 7 1 7 34002 77 023 67 13303
O conjunto de comandos disponíveis em uma fonte de 7 programas significa que é basicamente apenas um literal que representa a pilha original (não há mais nada que você possa fazer com apenas comandos escapados 6
e 7
). Portanto, a primeira coisa que um programa fará é colocar um monte de coisas na pilha. Veja como a pilha cuida da execução do programa ( |
separa os elementos da pilha, como de costume em 7):
772 | 7 | 34662 | 023 73363
O elemento final da pilha é copiado para se tornar o código a ser executado (enquanto permanece na pilha). Por acaso, essa é a única parte do programa que é código; tudo o resto são apenas dados. Aqui está o que ele se traduz:
73363
7 Empurre um elemento vazio para a pilha
3 Faça a saída do elemento de pilha superior, descarte o elemento abaixo
73 Efeito combinado destes: descarte o elemento de pilha superior
3 Faça a saída do elemento de pilha superior, descarte o elemento abaixo
6 Escape do elemento de pilha superior e depois anexá-lo ao elemento abaixo
3 Solte o elemento da pilha superior e descarte o elemento abaixo
Em outras palavras, isso é basicamente apenas um monte de instruções de E / S. Vamos analisar isso em detalhes:
73
descarta o 73363
que ainda está no topo da pilha.
3
produz o 023
e descarta o 34662
. Assim, pode-se ver que este 34662
é um comentário, que foi usado para armazenar os bytes necessários na outra versão do programa. Quanto ao que 023
ocorre quando a saída é selecionada, seleciona o formato de E / S 0 (inteiros) e, em seguida, 23
é uma diretiva que solicita que a implementação insira um número inteiro (em 7, você insere através da saída de códigos específicos que solicitam entrada). A entrada é feita fazendo cópias do elemento da pilha abaixo, por exemplo, se o número inteiro da entrada for 10, o próximo elemento da pilha (atualmente 7
) se tornará 7777777777
. Portanto, estamos aceitando a entrada do usuário em decimal, mas ela está sendo armazenada como unária.
6
escapa o elemento da pilha superior (alterando cada instância de 7
para 1
; é assim que as cadeias consistindo inteiramente de 7
s são escapadas) e, em seguida, anexa-o ao elemento da pilha antes de ( 772
). Portanto, nossos dados agora são algo parecidos 7721111111111
.
- Por fim,
3
gera o elemento de pilha em questão (e exibe um elemento de pilha em branco que faz parte da pilha inicial padrão). Seu valor é calculado com base no número de 1
s e 7
s, e subtraindo o número de 0
s e 6
s. (O 2
meio é ignorado na maioria dos casos; se estiver no final da cadeia, ele se tornará uma nova linha à direita em vez de ser ignorada, mas as regras do PPCG não se importam com isso.) Assim, a saída é a original entrada mais 2.
Neste ponto, não há nada útil na pilha e nada no programa, portanto o programa é encerrado.
Como invertemos isso? É uma simples questão de alterar 11
para 00
, para que acrescentemos caracteres à entrada que a torna 2 menor, em vez de 2 maior. Existem 00
oito dígitos octais convenientemente ocultos mais adiante no programa (para que os dígitos octais e bytes sejam alinhados um com o outro), para que possamos trocá-lo simplesmente 11
no início.