Este programa está lleno de caracteres no imprimibles, así que aquí hay un hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Nota: esto utiliza una rutina de entrada numérica que es incapaz de ingresar números negativos, por lo que este envío está restringido solo a enteros no negativos.
Un problema con policías y ladrones desafíos de es que no escribes explicaciones del código (para que sea más difícil de descifrar). Por otro lado, esto significa que no tengo que preocuparme aquí.
Elegí 7 como idioma porque, especialmente en su notación comprimida, es bastante difícil de leer, y no veo por qué debería ser solo yo quien tiene que molestarse en mover trozos de programas de 8 bits escritos en Una codificación de 3 bits. ¡Buena suerte!
Explicación
Ahora que el programa ha sido descifrado (por fuerza bruta, desafortunadamente; eso siempre es un peligro en estas soluciones cortas), también podría explicar a qué me estaba refiriendo. Esto fue en realidad bastante solucionable leyendo el programa; Podría haberlo hecho mucho más difícil, pero me pareció una mala idea cuando existen grietas por fuerza bruta.
Comenzaremos representando el programa en una codificación más natural. Como de costumbre, los números en negrita indican comandos que se ejecutan inmediatamente (no todos son representables en un programa; 6
y 7
son pero2
a 5
no lo son), los números representan unbolded sus equivalentes escapado ( 0
a 5
, todos los cuales son representables en el programa original; nota eso 0
es un escape 6
y 1
es un escape 7
):
112 7 1 7 34002 77 023 67 13303
El conjunto de comandos disponibles en una fuente de 7 programas significa que es básicamente un literal que representa la pila original (no hay nada más que pueda hacer con los comandos que se escapan 6
y 7
). Entonces, lo primero que hará un programa es empujar un montón de cosas a la pila. Así se ve la pila después de la ejecución del programa ( |
separa los elementos de la pila, como es habitual en 7):
772 | 7 | 34662 | 023 | 73363
El elemento final de la pila se copia para convertirse en el código a ejecutar (mientras permanece en la pila). Resulta que esta es la única parte del programa que es código; todo lo demás son solo datos. Esto es a lo que se traduce:
73363
7 Empuje un elemento vacío en la pila
3 Imprima el elemento superior de la pila, descarte el elemento inferior
73 Efecto combinado de estos: descarte el elemento superior de la pila
de la pila superior 3 Genere el de la pila superior, descarte el elemento de abajo
6 Escape del elemento de la pila superior, luego añádelo al elemento a continuación
3 Imprime el elemento de pila superior, descarta el elemento a continuación
En otras palabras, esto es principalmente un montón de instrucciones de E / S. Analicemos esto en detalle:
73
descarta el 73363
que todavía está en la parte superior de la pila.
3
genera el 023
, y descarta el 34662
. Por lo tanto, se puede ver que el34662
es un comentario, que se utilizó para almacenar los bytes necesarios en la otra versión del programa. En cuanto a lo que 023
hace cuando sale, selecciona el formato de E / S 0 (enteros), luego 23
es una directiva que solicita la implementación para ingresar un entero (en 7, ingresa a través de la salida de códigos específicos que solicitan entrada). La entrada se realiza haciendo copias del elemento de pila a continuación, por ejemplo, si el entero de entrada es 10, el siguiente elemento de pila (actualmente 7
) se convertirá 7777777777
. Por lo tanto, estamos aceptando la entrada del usuario en decimal, pero se está almacenando como unario.
6
escapa al elemento de la pila superior (cambiando cada instancia de 7
a 1
; así es como las cadenas consisten completamente en7
se escapan las s), luego lo agrega al elemento de pila antes ( 772
). Entonces nuestros datos ahora son algo así como7721111111111
.
- Finalmente,
3
genera el elemento de pila en cuestión (y muestra un elemento de pila en blanco que forma parte de la pila inicial predeterminada). Su valor se calcula tomando el número de 1
sy7
s, y restando el número de 0
s y 6
s. (El 2
medio se ignora en la mayoría de los casos; si está al final de la cadena, se convertirá en una nueva línea final en lugar de ignorarse, pero las reglas PPCG no se preocupan por eso). Por lo tanto, el resultado es el original entrada más 2.
En este punto, no hay nada útil en la pila y nada en el programa, por lo que el programa se cierra.
¿Cómo revertimos esto? Es una simple cuestión de cambiar el 11
a 00
, de modo que estamos anteponiendo caracteres a la entrada que lo hacen 2 más bajo, en lugar de 2 más alto. Hay unos 00
ocho dígitos octales convenientemente ocultos más adelante en el programa (para que los dígitos octales y los bytes se alineen entre sí), por lo que simplemente podemos intercambiarlo con el 11
al comienzo.