Szenario
Einer Ihrer Freunde hat mit Hausaufgaben zu kämpfen. Er braucht ein einfaches Programm, das die ersten 404 natürlichen Zahlen ausgibt:
1 2 3 4 5 6 7 8 9 10 11 ... 401 402 403 404
Ihre Herausforderung ist einfach: Schreiben Sie dieses Programm für ihn.
Ihre Verbindung ist jedoch schrecklich, sodass jedes Mal, wenn Sie das Programm senden, 1 zufälliges Zeichen verloren geht. Um dies zu verhindern aus Ihrem Programm zu brechen, müssen Sie machen es so , dass das Entfernen jedes einzelne Zeichen haben keine Wirkung: das Programm funktioniert, egal. (Das Originalprogramm muss auch funktionieren.)
Da die Verbindung zu schlecht ist, um große Dateien zu senden, muss Ihr Code so kurz wie möglich sein.
TL: DR - Erstellen Sie ein strahlungsgehärtetes Programm, um die Zahlen 1 bis 404 auszugeben
Regeln / Details
- Die Ausgabe kann eine Liste von ganzen Zahlen in jedem vernünftigen Format sein (durch Leerzeichen, Zeilenumbrüche, Kommas usw. getrennt). Ihre Ausgabe muss jedoch konsistent sein und darf sich nicht ändern, wenn das Programm geändert wird.
- Befehlszeilen-Flags, die Logik enthalten, tatsächlichen Code ausführen, die Nummernliste generieren usw., sind gesperrt.
- Das ist Code-Golf , also gewinnt die kürzeste Einsendung (in Bytes)!
Antworten:
05AB1E , 12 Bytes
Code:
Normale Codeerklärung:
Dies führt zu folgendem Code für den Golfsport: Dies
X404Ÿ
ist das, was wir erreichen wollen.Die Nummer 404 wird durch eine der folgenden Varianten generiert:
Der Inklusivbereich funktioniert wie folgt bei zwei Nummern:
Was den zweiten immer
Ÿ
zum No-Op macht .Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
JavaScript, 228 Bytes
Erläuterung
Durch die Auswertung von Code in a
setInterval
kann das Programm fortgesetzt werden, auch wenn ein Fehler vorliegt. Wir stellen sicher, dass der übergebene Code fehlerhaft ist, wenn ein einzelnes Zeichen entfernt wird. Die Template-String-Syntax kann missbraucht werden, umsetInterval
einen konstanten String ohne Klammern aufzurufen . Glücklicherweise wird der Template-String, auch wenn er sich in der nächsten Zeile befindet, immer noch als Funktionsaufruf mit einer solchen Syntax analysiert.Das erste Problem, auf das wir stoßen,
setInterval
ist eine Funktion. Wenn also ein Zeichen entfernt wird und das Programm versucht, es aufzurufensetInteval
, tritt ein Fehler auf. Da es zwei identische Aufrufe von gibtsetInterval
, müssen wir uns natürlich nicht darum kümmern, dass es tatsächlich richtig funktioniert, solange wir den Fehler vermeiden. Die erste Zeile definiert also jeden möglichen "Rechtschreibfehler"setTimeout
einer gültigen Funktion.Die erste Zeile weist der Funktion all diese "Rechtschreibfehler" zu
top=>4
. Beachten Sie die ES6-Syntax. Dazu wird einfach ein Parameter mit dem Namen "top" verwendet und 4 zurückgegeben. Warum "top"? Nun, die erste Zeile darf niemals einen Fehler auslösen, auch wenn ein Zeichen entfernt wurde. Wenn ein=
entfernt wird, um zu machentop>4
, ist dieser boolesche Ausdruck gültig, da ertop
in Browsern vordefiniert ist, was einfach ergibtfalse
. Wenn die 4 entfernt wird, wird der Funktionskörper einfach zum erstensetInterval
Segment, und das zweite Segment läuft unversehrt.Jetzt müssen Sie sich nur noch Sorgen machen, wenn ein `entfernt wird.
Wenn es von Anfang an entfernt wird,
setInterval
tut es einfach nichts und wertet es als seinen eigenen Ausdruck aus. Der Rest der zweiten Zeile führt dann einfach eine einzelne Iteration der Schleife aus, sodass das anderesetInterval
Fragment den Job abschließt. Wenn vom Ende entfernt, wird der verbleibende Backtick am Ende des Kommentars abgeholt.Die Zeilenumbrüche sind so platziert, dass das Entfernen eines Zeichens das Programmverhalten nicht beeinflusst, aber sie verhindern Fehler bei einigen Zeichenentfernungen wie dem führenden Backtick.
quelle
405
entfernt würde, aber dann wurde mir klar: nichts, weil entweder alle 404-Zahlen bereits gedruckt wurden oder die zweite Schleife die fehlenden ausgibt. Spektakuläre Arbeit.this
?Pyth - 16 Bytes
Die Grundidee dahinter ist, dass, wenn Sie eine Ziffer abziehen
404
, die Zahl nur kleiner wird, sodass wir nur maximal zwei erhalten müssen404
, um sicherzustellen, dass wir die richtige Zahl haben. Offensichtlich gibt es eine Menge mehr Entlassungen.Erläuterung:
Probieren Sie es hier online aus .
quelle
Befunge-98 , 37 Bytes
Probieren Sie es online!
Erläuterung
Strahlungsgehärteten Code macht in Befunge-98 ist nicht allzu schlecht, weil Sie das „Delta“ gesetzt (dh das Schrittweite des Befehlszeigers) manuell mit
x
. Wenn Sie also das Delta auf setzen(2,0)
, wird von da an jedes andere Zeichen übersprungen und wir können einfach alle Befehle verdoppeln. Das Knifflige ist,2 0
zuverlässig auf den Stapel zu kommen. Wir brauchen0 2 0
für den Rest das Programm, um richtig zu funktionieren, aber das ist kostenlos. So machen wir das:Beachten Sie, dass sich jede Ziffer von selbst drückt, sodass es im vollständigen Programm einen Start gibt,
2 0
den wir einfach ignorieren.Folglich ist es irrelevant, entweder das erste oder das zweite Zeichen aus dem Programm zu entfernen, da wir diese Ziffern sowieso nicht verwenden. Ebenso ist das Entfernen des dritten Zeichens identisch mit dem Entfernen des zweiten Zeichens, sodass wir uns auch darüber keine Sorgen machen müssen.
Überlegen wir uns, was in den beiden anderen Fällen passiert. Löschen des vierten Zeichens:
Beachten Sie, dass das Delta auf eingestellt ist
(0,0)
. Dadurch wird der Befehlszeiger jedoch überhaupt nicht verschoben, sodass derselbex
sofort erneut ausgeführt wird und diesmal das Symbol erscheint(2,0)
und alles in Ordnung ist (für unsere späteren Zwecke befinden sich implizite Nullen am unteren Rand des Stapels).Lassen Sie uns stattdessen das fünfte Zeichen fallen:
Jetzt wird das Delta auf gesetzt
(0,2)
. Es findet jedoch immer noch keine horizontale Bewegung statt, sodass die IP sofort wieder inx
das richtige Delta zurückkehrt und es erneut eingestellt wird.Ab diesem Zeitpunkt können wir die Zeichenverdoppelung sowie diesen ersten Teil grundsätzlich ignorieren, da er immer übersprungen wird:
Das
;
ist eine Art von Kommentar - Befehl, der alles überspringt , bis die nächsten;
auftritt. Wir überspringen jedoch das erste;
mit,#
so dass nur der Teil zwischen dem;
von diesem Punkt an ausgeführt wird.quelle
> <> ,
1036051 BytesHier getestet.
Verwendet die gleiche Taktik wie dieses Programm . Wenn ein Zeichen in der ersten Zeile gelöscht wird, wird die zweite Zeile weiterhin ausgeführt. Wenn ein Zeichen in der 2. Zeile gelöscht wird,
v
wird die Ausführung in die 3. Zeile verschoben, da die 2. Zeile ein Zeichen kürzer ist. Ein Löschen in der 3. Zeile hat keine Auswirkung auf die Programmsteuerung, da es erst nach einem Löschen in Zeile 2 ausgeführt wird.Das Programm funktioniert auch, wenn ein Zeilenumbruch gelöscht wird:
Fall 1:
Die 2. Zeile wird ausgeführt.
Fall 2:
Beide Zeilen werden zu einer Zeile mit der doppelten Anzahl von Anweisungen.
Erläuterung:
Der Kern des Programms ist der folgende. Beachten Sie, dass a
1
bereits von der ersten Zeile auf den Stapel geschoben wird.quelle
o" e"
?+1
kannst du verwendenl
. Auch der fishlanguage.com-Interpreter ist etwas seltsam (und ärgerlich in der Verwendung, obwohl die Debugging-Funktion natürlich nützlich ist). Ich denke, TIO verwendet den etwas vernünftigeren Python-Interpreter: tio.run/nexus/fish#@m9oqIAMysq4AMuxtrfVMslXUkhVssqzsrHBEPj/HwA1
s in der ersten Zeile entfernen .> <> ,
42 3834 BytesProbieren Sie es online!
Vielen Dank an @Martin Ender und @Teal Pelican für das Abschneiden von 8 Bytes!
Entspricht der Antwort von mbomb007 , verwendet jedoch nur 2 Zeilen.
Anstatt mit einem einzigen Speicherwert von 1 auf 404 hochzuzählen, habe ich die Länge des Stapels kontinuierlich verschoben. Dies machte es so, dass ich nichts auf den Stapel legen musste, bevor die Schleife begann, was die Dinge viel einfacher machte.
Der ursprüngliche Code
Das
<
s dreht die IP um und das/
ist ein No-Op, da die IP sich umschlingt und auf ihrem normalen Pfad weitergeht. Somit ist der relevante Code:Und das wiederholt sich.
Die Löschung
Der große Schlüssel ist hier der Spiegel
/
. Es macht nichts, wenn die zweite Zeile geändert wird - es dreht sich nur um sich selbst und ist im Grunde genommen ein No-Op. Wenn jedoch ein Zeichen aus der ersten Zeile entfernt wird, wird die Zeile nach unten verschoben, sodass der Spiegel auf den Pfeil trifft<
und zu einer identischen, nicht modifizierten Schleife führt.Die einzige andere bedeutende Streichung wäre das
\n
Zeichen. Dies wird auch berücksichtigt, da es diesen Code erzeugt:Jetzt haben wir eine Kopie der Originalschleife
;?=*4o" e"lnll
an sich selbst angehängt . Da es sich um eine Schleife handelt, hat dies keinen Einfluss auf die Ausführung und wird so ausgeführt, als hätte sich nichts geändert.quelle
:+1
und das andere:
durchl
jedes ersetzen .;?=*4o" e"n:ll
funktioniert auch.Ein Birnbaum , 34 Bytes
Das Programm enthält Steuerzeichen, daher hier ein
xxd
Dump:Ein Birnenbaum ist im Grunde ein Perl-Derivat mit einigen "interessanten" Merkmalen. Ich habe es als Scherz zusammengestellt (damit ich sagen kann, dass mein Polyglot
a partridge
in A Pear Tree gedruckt ist ; tatsächlich tun es fast alle Programme). Allerdings ist es Turing-complete und tatsächlich irgendwie gut in dieser Art von Herausforderung.Die Funktion, die uns hier am meisten interessiert, ist, dass A Pear Tree nur dann ein Programm ausführt, wenn ein Teil des Codes eine CRC-32 von hat
00000000
. Der Code wird gedreht, um die betreffende Teilzeichenfolge am Anfang zu platzieren. Zufälligerweise haben die beiden (identischen) Code-Hälften jeweils den fraglichen CRC-32 (aufgrund dieses verdächtig aussehenden binären Kommentars am Ende). Wenn Sie also ein Zeichen aus der Quelle löschen (um den CRC zu brechen), Die andere Hälfte wird zum Start gedreht, und das#
Zeichen am Ende zeigt die beschädigte Hälfte zusätzlich zum Binär-Junk an.Ein weiteres Feature macht das Programm etwas kleiner: Obwohl A Pear Tree meist als Perl interpretiert wird, wurden einige geringfügige Änderungen vorgenommen, damit es mehr wie Python funktioniert. Eines, das hier relevant ist, ist, dass im Gegensatz zu Perls
print
Aussage (die nur die Zahlen zusammenfasst) dieprint
Aussage von A Pear Tree Argumente durch Leerzeichen trennt und eine letzte neue Zeile ausgibt. Dadurch erhalten wir eine durch Leerzeichen getrennte Ausgabe, sodass wir beim Formatieren keine Bytes verschwenden müssen. (Beachten Sie, dass Sie dem Programm keine Eingabe geben müssen. Wenn die Sprache Eingaben empfängt, wird standardmäßig davon ausgegangen, dass sie etwas damit anfangen soll.)Natürlich kann dies nicht mit den tatsächlichen Golfsprachen mithalten (und ich würde es auch nicht erwarten), aber ich dachte, die Leute finden es vielleicht interessant.
quelle
Befunge 98 , 34 Bytes
Probieren Sie es online!
Dies funktioniert sehr ähnlich wie bei meiner Antwort> <> , aber anstelle des Spiegels verwende
/
ich den Vorgang "Nach links drehen"[
und kehre dann die IP-Richtung um, die in diesem Fall funktionell einem Spiegel entspricht.Der ursprüngliche Code
Die Löschung
Wenn etwas in der zweiten Zeile gelöscht wird, wird es verschoben und wirkt sich überhaupt nicht auf die Oberseite aus.
Wenn irgendetwas in der ersten Zeile gelöscht
[
wird, sendet der die IP in die<
, die eine identische Schleife startet (mit der Ausnahme,2j^^
dass die^
s vermieden werden, die zusammen mit der verwendet werden[
).Da es 2 neue Zeilen gibt, spielt es keine Rolle, ob einer gelöscht wird (danke an @ masterX244 dafür!)
quelle
Befunge-93,
5451 BytesVielen Dank an Mistah Figgins , die mir 3 Bytes gespart hat.
Probieren Sie es online!
Dies ist im Wesentlichen derselbe Trick wie bei der fehlertoleranten Hello World- Challenge. Die erste Zeile beginnt, indem Sie sicherstellen, dass am Anfang der Sequenz eine 1 auf dem Stapel steht, und dann
v
leitet einer der Pfeile am Ende der Zeile den Codepfad zum Anfang der Hauptroutine in Zeile 2 um von rechts nach links ausführen.Wenn Sie ein Zeichen aus der ersten Zeile entfernen, werden die
v
Pfeile nur um eins verschoben. Dadurch kann der Code jedoch weiterhin erfolgreich in die zweite Zeile umgeleitet werden. Wenn Sie ein Zeichen aus der zweiten Zeile entfernen, wird der<
Pfeil am Ende der Zeile aus dem Pfadv
darüber verschoben , sodass der Codepfad zur Sicherungsroutine in Zeile 3 umgeleitet wird.Das Entfernen des ersten Zeilenumbruchs schadet nicht, da dadurch nur die dritte Zeile an ihren Platz verschoben wird, um die zweite Zeile zu ersetzen. Das Entfernen von Elementen nach dem Ende der zweiten Zeile hat keine Auswirkung, da dies nur der Sicherungscode ist.
quelle
The first line starts by making sure there is a 1 on the top of the stack...
Die erste Zeile ist in dieser Hinsicht ziemlich sicher. Sie können auch den <code> _ @ # kürzen!</code> to
_ @ # - `und vor dem Drucken platzieren, um 3 Bytes zu sparen.JavaScript + HTML + Stack Snippets,
167158154 BytesMissbrauch der Tatsache, dass JavaScript in Stack-Snippets auf einer Webseite in einem
<script>
Element platziert wird.quelle
Eigentlich 18 Bytes
Eigentlich ist eine Stack-basierte Golfsprache.
Erläuterung der beteiligten Befehle (wie sie im obigen Kontext funktionieren):
quelle