La tâche consiste à écrire un irradiateur durci aux radiations. Qu'est-ce que je veux dire par là, exactement?
Un irradiateur est un programme qui, lorsqu'il reçoit une chaîne en entrée, sortira toutes les versions possibles de la chaîne avec un caractère supprimé. Par exemple, étant donné l'entrée Hello, world!
, le programme devrait sortir:
ello, world!
Hllo, world!
Helo, world!
Helo, world!
Hell, world!
Hello world!
Hello,world!
Hello, orld!
Hello, wrld!
Hello, wold!
Hello, word!
Hello, worl!
Hello, world
Un irradiateur, cependant, doit être protégé de son rayonnement, de sorte que l'irradiateur que vous écrivez doit également survivre lorsqu'il est traversé. Autrement dit, lorsqu'un octet unique de votre programme est supprimé, le programme doit toujours fonctionner correctement.
Cas de test
abc -> bc; ac; ab
foo bar -> oo bar:fo bar:fo bar:foobar:foo ar:foo br:foo ba
source -> ource;surce;sorce;souce;soure;sourc;
Caractéristiques
- Vous pouvez prendre la saisie par toute méthode acceptable selon nos règles d'E / S standard
- La sortie peut être soit une liste de chaînes, soit une liste imprimée délimitée par un caractère ou un groupe de caractères. Un délimiteur de fin est acceptable
- La sortie peut être dans n'importe quel ordre tant qu'elle contient toutes les versions possibles
- Entrées en double (telles que les deux
Helo, world!
s dans le premier exemple) peuvent être filtrées, mais ce n'est pas nécessaire - Comme il s'agit de code-golf , le plus petit programme, en octets, gagne
code-golf
radiation-hardening
TheOnlyMrCat
la source
la source
v
invoid
supprimé ne se compilera pasRéponses:
05AB1E ,
2926 octetsEssayez-le en ligne! ou essayez toutes les versions irradiées .
L'irradiateur le plus court que j'ai pu trouver est de 5 octets:
L'idée est de répéter cela 3 fois, puis de voter à la majorité:
Å
est un préfixe pour les commandes à 2 octets, mais il n'y a pas deÅ`
commande, c'est pourquoi leÅ
est ignoré. Nous en aurons besoin plus tard, cependant.Le tri garantit que le vote majoritaire se trouve au milieu du tableau. Le vidage puis l'échange permettent d'obtenir cette valeur en haut de la pile.
Toute irradiation dans la partie initiale se traduit uniquement par une erreur dans le tableau global, qui est résolue par le vote majoritaire. Les irradiations dans le
{Å`s
bit final sont beaucoup plus difficiles à raisonner:Å
est ignoré de toute façon, il est donc normal de l'irradierSi le backtick est irradié,
Å`s
devientÅs
, qui est la commande étendue "get middle of the array".Si
{
ous
sont irradiés, cela signifie que rien d'autre ne l'est, donc le tableau global a la même valeur trois fois. Dans ce cas, nous n'avons pas besoin de trier / échanger, n'importe quelle valeur fonctionnera.la source
Code machine 8086 (MS-DOS .COM), 83 octets
Exécutable dans DOSBox ou votre moteur de calcul à vapeur préféré. La chaîne à irradier est donnée comme argument de ligne de commande.
Binaire:
Lisible:
Fatigué
La partie active est dupliquée afin qu'il y en ait toujours une non touchée par le rayonnement. Nous sélectionnons la version saine au moyen de sauts. Chaque saut est un saut court, et ne fait donc que deux octets de long, où le deuxième octet est le déplacement (c'est-à-dire la distance à sauter, le signe déterminant la direction).
Nous pouvons diviser le code en quatre parties qui pourraient être irradiées: saut 1, code 1, saut 2 et code 2. L'idée est de s'assurer qu'une partie de code propre est toujours utilisée. Si l'une des parties de code est irradiée, l'autre doit être choisie, mais si l'un des sauts est irradié, les deux parties de code seront propres, donc peu importe celle qui est choisie.
La raison d'avoir deux parties de saut est de détecter l'irradiation dans la première partie en sautant par-dessus. Si la première partie du code est irradiée, cela signifie que nous arriverons à un octet de la marque. Si nous nous assurons qu'un tel atterrissage bâclé sélectionne le code 2 et qu'un atterrissage correct sélectionne le code 1, nous sommes en or.
Pour les deux sauts, nous dupliquons l'octet de déplacement, ce qui fait que chaque partie de saut dure 3 octets. Cela garantit que l'irradiation dans l'un des deux derniers octets rendra toujours le saut valide. L'irradiation dans le premier octet empêchera le saut de se produire du tout, puisque les deux derniers octets formeront une instruction complètement différente.
Faites le premier saut:
Si l'un des
0x28
octets est supprimé, il sautera toujours au même endroit. Si l'0xEB
octet est supprimé, nous finirons à la place avecqui est une instruction bénigne sur MS-DOS (d'autres saveurs peuvent ne pas être d'accord), puis nous passons au code 1, qui doit être propre, car les dommages étaient au saut 1.
Si le saut est fait, on atterrit au deuxième saut:
Si cette séquence d'octets est intacte et que nous atterrissons directement sur la marque, cela signifie que le code 1 était propre et cette instruction revient à cette partie. L'octet de déplacement dupliqué garantit cela, même si c'est l'un de ces octets de déplacement qui a été endommagé. Si nous atterrissons un octet (en raison d'un code 1 endommagé ou d'un saut 1) ou si l'
0xEB
octet est celui endommagé, les deux octets restants seront également ici bénins:Quel que soit le cas, si nous finissons par exécuter ces deux instructions, nous savons que le saut 1, le code 1 ou le saut 2 ont été irradiés, ce qui rend la transition vers le code 2 sûre.
Essai
Le programme suivant a été utilisé pour créer automatiquement toutes les versions du fichier .COM. Il crée également un fichier BAT qui peut être exécuté dans l'environnement cible, qui exécute chaque binaire irradié et dirige leurs sorties vers des fichiers texte séparés. La comparaison des fichiers de sortie à valider est assez simple, mais DOSBox n'en a pas
fc
, elle n'a donc pas été ajoutée au fichier BAT.la source