Die Aufgabe besteht darin, einen strahlengehärteten Strahler zu schreiben. Was meine ich damit genau?
Ein Strahler ist ein Programm, das bei Eingabe einer Zeichenfolge alle möglichen Versionen der Zeichenfolge mit einem entfernten Zeichen ausgibt. Anhand der Eingabe Hello, world!
sollte das Programm beispielsweise Folgendes ausgeben:
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
Ein Strahler muss jedoch vor seiner Strahlung geschützt werden, sodass der von Ihnen geschriebene Strahler auch dann überleben muss, wenn er von selbst durchdrungen wird. Das heißt, wenn ein einzelnes Byte Ihres Programms entfernt wird, muss das Programm weiterhin ordnungsgemäß funktionieren.
Testfälle
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;
Spezifikationen
- Sie können nach unseren Standard-E / A-Regeln Eingaben auf jede akzeptable Weise vornehmen
- Die Ausgabe kann entweder eine Liste von Zeichenfolgen oder eine gedruckte Liste sein, die durch ein Zeichen oder eine Gruppe von Zeichen begrenzt ist. Ein nachgestelltes Trennzeichen ist zulässig
- Die Ausgabe kann in beliebiger Reihenfolge erfolgen, sofern alle möglichen Versionen enthalten sind
- Doppelte Einträge (wie die beiden
Helo, world!
im ersten Beispiel) können herausgefiltert werden, dies ist jedoch nicht erforderlich - Da es sich um Code-Golf , das kleinste Programm, in Bytes, gewinnt
code-golf
radiation-hardening
TheOnlyMrCat
quelle
quelle
v
invoid
entfernt nicht kompilierenAntworten:
05AB1E ,
2926 BytesProbieren Sie es online! , oder versuchen Sie es mit allen bestrahlten Versionen .
Der kürzeste Strahler, den ich finden konnte, ist 5 Bytes:
Die Idee ist, dies dreimal zu wiederholen und dann mit der Mehrheit abzustimmen:
Å
ist ein Präfix für 2-Byte-Befehle, aber es gibt keineÅ`
Befehl, weshalb derÅ
ignoriert wird. Wir werden es aber später brauchen.Durch das Sortieren wird sichergestellt, dass sich die Mehrheitsabstimmung in der Mitte des Arrays befindet. Durch Dumping und anschließendes Austauschen wird dieser Wert an die Spitze des Stapels verschoben.
Jede Bestrahlung im ersten Teil führt nur zu einem Fehler im globalen Array, der durch die Mehrheitsabstimmung behoben wird. Bestrahlungen im letzten
{Å`s
Bit sind viel schwieriger zu beurteilen:Å
wird sowieso ignoriert, es ist also in Ordnung, es zu bestrahlenWenn der Backtick bestrahlt
Å`s
wirdÅs
, wird der erweiterte Befehl "Mitte des Arrays abrufen" angezeigt .Wenn
{
oders
bestrahlt werden, bedeutet dies, dass nichts anderes vorhanden ist. Das globale Array hat also dreimal den gleichen Wert. In diesem Fall müssen wir nicht sortieren / tauschen, jeder Wert wird funktionieren.quelle
8086-Computercode (MS-DOS .COM), 83 Byte
Kann in DOSBox oder Ihrer bevorzugten dampfbetriebenen Computer-Engine ausgeführt werden. Die zu bestrahlende Zeichenfolge wird als Befehlszeilenargument angegeben.
Binär:
Lesbar:
Heruntergewirtschaftet
Der aktive Teil wird dupliziert, so dass immer einer von der Strahlung unberührt bleibt. Wir wählen die gesunde Version durch Sprünge aus. Jeder Sprung ist ein kurzer Sprung und somit nur zwei Bytes lang, wobei das zweite Byte die Verschiebung (dh die Entfernung zum Sprung mit vorzeichenbestimmender Richtung) ist.
Wir können den Code in vier Teile aufteilen, die bestrahlt werden könnten: Sprung 1, Code 1, Sprung 2 und Code 2. Es soll sichergestellt werden, dass immer ein sauberer Codeteil verwendet wird. Wenn einer der Codeteile bestrahlt wird, muss der andere ausgewählt werden. Wenn jedoch einer der Sprünge bestrahlt wird, sind beide Codeteile sauber, sodass es egal ist, welcher ausgewählt wird.
Der Grund für das Vorhandensein von zwei Sprungteilen besteht darin, die Bestrahlung im ersten Teil durch Überspringen festzustellen. Wenn der erste Codeteil bestrahlt wird, bedeutet dies, dass wir ein Byte vor der Markierung ankommen. Wenn wir sicherstellen, dass eine solche verpatzte Landung Code 2 und eine richtige Landung Code 1 auswählt, sind wir golden.
Für beide Sprünge duplizieren wir das Verschiebungsbyte, wodurch jeder Sprungteil 3 Bytes lang wird. Dies stellt sicher, dass die Bestrahlung in einem der beiden letzten Bytes den Sprung weiterhin gültig macht. Die Bestrahlung im ersten Byte verhindert den Sprung, da die letzten beiden Bytes einen völlig anderen Befehl bilden.
Mach den ersten Sprung:
Wenn eines der
0x28
Bytes entfernt wird, springt es immer noch an dieselbe Stelle. Wenn das0xEB
Byte entfernt wird, erhalten wir stattdessenDies ist eine harmlose Anweisung für MS-DOS (andere Varianten stimmen möglicherweise nicht überein), und dann fahren wir mit Code 1 fort, der sauber sein muss, da der Schaden bei Sprung 1 lag.
Wenn der Sprung gemacht ist, landen wir beim zweiten Sprung:
Wenn diese Bytesequenz intakt ist und wir direkt auf der Markierung landen, bedeutet dies, dass Code 1 sauber war und dieser Befehl zu diesem Teil zurückspringt. Das duplizierte Verschiebungsbyte garantiert dies, auch wenn eines dieser Verschiebungsbytes beschädigt wurde. Wenn wir entweder ein Byte weniger landen (wegen eines beschädigten Codes 1 oder Sprung 1) oder das
0xEB
Byte das beschädigte ist, sind die beiden verbleibenden Bytes auch hier gutartig:Wie auch immer, wenn wir diese beiden Anweisungen ausführen, wissen wir, dass entweder Sprung 1, Code 1 oder Sprung 2 bestrahlt wurden, wodurch ein Durchbruch zu Code 2 sicher ist.
Testen
Das folgende Programm wurde verwendet, um automatisch alle Versionen der .COM-Datei zu erstellen. Außerdem wird eine BAT-Datei erstellt, die in der Zielumgebung ausgeführt werden kann, in der jede bestrahlte Binärdatei ausgeführt wird, und deren Ausgaben werden an separate Textdateien weitergeleitet. Der Vergleich der Ausgabedateien zur Validierung ist recht einfach, DOSBox jedoch nicht. Daher
fc
wurde sie nicht zur BAT-Datei hinzugefügt.quelle