Ce programme est plein de caractères non imprimables, alors voici un hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Remarque: ceci utilise une routine de saisie numérique incapable de saisir des nombres négatifs. Cette soumission est donc limitée aux entiers non négatifs uniquement.
Un problème avec les problèmes des flics et des voleurs est que vous n'écrivez pas d'explication du code (pour le rendre plus difficile à résoudre). D'un autre côté, cela signifie que je n'ai pas à me préoccuper de la situation.
J'ai choisi 7 comme langage parce que, surtout dans sa notation comprimée, il est assez difficile à lire, et je ne vois pas pourquoi ce devrait être seulement moi qui dois prendre la peine de déplacer des morceaux de programmes 8 bits écrits en un encodage à 3 bits. Bonne chance!
Explication
Maintenant que le programme a été fissuré (par force brutale, malheureusement, cela reste toujours un danger pour ces solutions courtes), je pourrais aussi bien expliquer ce à quoi je voulais en venir. C'était en fait assez soluble en lisant le programme; J'aurais pu rendre les choses beaucoup plus difficiles, mais cela semblait être une mauvaise idée lorsqu'il existe des fissures par force brute.
Nous allons commencer par représenter le programme dans un encodage plus naturel. Comme d' habitude, les chiffres indiquent les commandes bolded maintenant (pas tous qui sont représentables dans un programme, 6
et 7
sont , mais 2
à 5
ne sont pas), le nombre unbolded représentent leurs équivalents échappées ( 0
à 5
, qui sont tous représentables dans le programme original; note c'est 0
un évadé 6
et 1
un évadé 7
):
112 7 1 7 34002 77 023 67 13303
L'ensemble des commandes disponibles dans une source de programme 7 signifie qu'il ne s'agit en fait que d'un littéral représentant la pile d'origine (vous ne pouvez rien faire d'autre avec des commandes échappées, 6
et 7
). Donc, la première chose qu'un programme fera est de mettre un tas de choses sur la pile. Voici à quoi ressemble la pile après l'exécution du programme ( |
sépare les éléments de la pile, comme d'habitude dans 7):
772 | 7 | 34662 | 023 | 73363
Le dernier élément de la pile est ensuite copié pour devenir le code à exécuter (tout en restant sur la pile). En l’occurrence, c’est la seule partie du programme qui soit codée; tout le reste n'est que des données. Voici ce que cela traduit:
73363
7 Poussez un élément vide sur la pile
3 Sortez l'élément de pile supérieur, jetez l'élément inférieur à
73 Effet combiné de ceux-ci: éliminez l'élément de pile supérieur
3 Sortez l'élément de pile supérieur, jetez l'élément inférieur
6 Échappez l'élément de pile supérieur, puis l'ajouter à l'élément ci-dessous
3 Sortez l'élément de pile supérieur, supprimez l'élément ci-dessous
En d'autres termes, il ne s'agit généralement que d'un ensemble d'instructions d'E / S. Analysons cela en détail:
73
élimine le 73363
qui est toujours sur la pile.
3
sort le 023
et jette le 34662
. On voit donc qu'il 34662
s'agit d'un commentaire qui a été utilisé pour stocker les octets nécessaires dans l'autre version du programme. Pour ce 023
qui est de la sortie, il sélectionne le format d'E / S 0 (nombres entiers), puis 23
une directive qui demande à l'implémentation de saisir un entier (en 7, vous saisissez via la sortie des codes spécifiques qui demandent une entrée). L’entrée est réalisée en faisant des copies de l’élément de pile ci-dessous, par exemple si le nombre entier saisi est 10, l’élément de pile suivant (actuellement 7
) deviendra 7777777777
. Ainsi, nous acceptons les entrées de l’utilisateur en décimal, mais elles sont stockées de manière unaire.
6
échappe à l'élément de pile supérieur (en changeant chaque instance de 7
en 1
; c'est comment les chaînes composées entièrement de 7
s sont échappées), puis l'ajoute à l'élément de pile avant ( 772
). Donc, nos données sont maintenant quelque chose comme 7721111111111
.
- Pour finir,
3
affiche l’élément de pile en question (et affiche un élément de pile vide faisant partie de la pile initiale par défaut). Sa valeur est calculée en prenant le nombre de 1
s et 7
s et en soustrayant le nombre de 0
s et 6
s. (Le 2
dans le milieu est ignoré dans la plupart des cas; s'il se trouve à la fin de la chaîne, il deviendra un saut de ligne au lieu d'être ignoré, mais les règles PPCG ne s'en soucient pas.) Ainsi, la sortie est l'original. entrée plus 2.
À ce stade, il n'y a rien d'utile sur la pile et rien dans le programme, donc le programme se ferme.
Comment inversons-nous cela? Il suffit de changer le 11
pour 00
, de sorte que nous ajoutons des caractères à l'entrée, ce qui le rend 2 plus bas, plutôt que 2 plus élevés. Il y a 00
huit chiffres octaux cachés plus loin dans le programme (de manière à ce que les chiffres octaux et les octets soient alignés), afin que nous puissions simplement les échanger avec 11
le début.