Fehler 404: Zeichen nicht gefunden


74

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 , also gewinnt die kürzeste Einsendung (in Bytes)!


16
Muss das Originalprogramm (ohne entfernte Zeichen) auch funktionieren?
Adnan

5
Können Fehler ignoriert werden, wenn das Programm noch 1 - 404 druckt?
Jrich

4
Vielleicht sollte es einen Tag geben, der strahlenhärtend ist ?
Vi.

5
Zum Abschluss der Abstimmung erledigen wir Ihre Hausaufgaben nicht für Sie. XD
チ チ ズ パ パ

Antworten:


16

05AB1E , 12 Bytes

Code:

XX440044ÔÔŸŸ

Normale Codeerklärung:

X             # Pushes the number 1.
 X            # Pushes the number 1 again.
  440044      # Pushes the number 440044.
        Ô     # Connected uniquify.
         Ô    # Connected uniquify.
          Ÿ   # Inclusive range of the top two elements.
           Ÿ  # Inclusive range on the array, which leaves it intact.

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:

440044ÔÔ
40044ÔÔ
44044ÔÔ
44004ÔÔ
440044Ô

Der Inklusivbereich funktioniert wie folgt bei zwei Nummern:

`1 5Ÿ`             ->    [1, 2, 3, 4, 5]
[1, 5]Ÿ            ->    [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]Ÿ   ->    [1, 2, 3, 4, 5]

Was den zweiten immer Ÿzum No-Op macht .

Verwendet die CP-1252- Codierung. Probieren Sie es online!


34

JavaScript, 228 Bytes

etInterval=stInterval=seInterval=setnterval=setIterval=setInerval=setIntrval=setInteval=setInteral=setIntervl=setInterva=top=>4

setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`
setInterval
`405>(i=this.i?i:1)?alert(i++):0`///`

Erläuterung

Durch die Auswertung von Code in a setIntervalkann 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, um setIntervaleinen 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, setIntervalist eine Funktion. Wenn also ein Zeichen entfernt wird und das Programm versucht, es aufzurufen setInteval, tritt ein Fehler auf. Da es zwei identische Aufrufe von gibt setInterval, 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" setTimeouteiner 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 machen top>4, ist dieser boolesche Ausdruck gültig, da er topin Browsern vordefiniert ist, was einfach ergibt false. Wenn die 4 entfernt wird, wird der Funktionskörper einfach zum ersten setIntervalSegment, 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, setIntervaltut 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 andere setIntervalFragment 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.


3
Ich überlegte, was passieren würde, wenn eine der Ziffern in a 405entfernt 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.
ETHproductions

Was passiert, wenn ein Teil von "top" verloren geht?
Scimonster

@Scimonster Es wird immer noch als eine Funktion analysiert, die 4 zurückgibt, nur mit dem nicht verwendeten Parameter "to" oder "op" oder "tp"
jrich

1
@jrich natürlich. Gehirnkrampf. : P
Scimonster

Was passiert, wenn Sie einen Teil verlieren this?
Dkudriavtsev

25

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üssen 404, um sicherzustellen, dass wir die richtige Zahl haben. Offensichtlich gibt es eine Menge mehr Entlassungen.

SSsetSS[404  404

Erläuterung:

SS                       First one does 1-index range, second one sorts, which is no-op 
 s                       If the e is there, this is no-op, if only t is there, it sums a one element list, which is the item
  et                     e picks last element in list, and if e is gone, then t gets you the list without the first element which is good enough when combined with s
   SS                    Sorting twice is no-op
    [                    Start list, this can't be two element because if we get rid of initial 4, the 0 becomes third element which neeeds to be captured
     404                 One of the 404's
     <space><space>404   Need two spaces for redundancy, because 404404 *is* bigger than 404

Probieren Sie es hier online aus .


23

Befunge-98 , 37 Bytes

20020xx##;;11++::''ee44**``kk@@::..;;

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 0zuverlässig auf den Stapel zu kommen. Wir brauchen 0 2 0für den Rest das Programm, um richtig zu funktionieren, aber das ist kostenlos. So machen wir das:

20020xx

Beachten Sie, dass sich jede Ziffer von selbst drückt, sodass es im vollständigen Programm einen Start gibt, 2 0den 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:

2000xx

Beachten Sie, dass das Delta auf eingestellt ist (0,0). Dadurch wird der Befehlszeiger jedoch überhaupt nicht verschoben, sodass derselbe xsofort 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:

2002xx

Jetzt wird das Delta auf gesetzt (0,2). Es findet jedoch immer noch keine horizontale Bewegung statt, sodass die IP sofort wieder in xdas 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:

...#;1+:'e4*`k@:.;

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.

1+    Increment the top of the stack.
:     Duplicate it.
'e    Push 101.
4*    Multiply by 4 to get 404.
`     Greater-than check. Pushes 1 once the top
      reaches 405, otherwise 0.
k@    Terminate the program that many times.
:.    Print a copy of the top of the stack (and a space).

16

> <> , 103 60 51 Bytes

               vv
;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Hier 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, vwird 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.

               vv;?=*4o" e"n:ll<<
;?=*4o" e"n:ll<<

Fall 2:

Beide Zeilen werden zu einer Zeile mit der doppelten Anzahl von Anweisungen.

               vv
;?=*4o" e"n:ll<<;?=*4o" e"n:ll<<

Erläuterung:

Der Kern des Programms ist der folgende. Beachten Sie, dass a 1bereits von der ersten Zeile auf den Stapel geschoben wird.

ll:n        Push length of the stack twice, duplicate, print as number
"e "o       Push 101, 32, output 32 as space
4*          101 * 4 is 404
=?;         Pop twice, if equal, halt
            (Execution wraps around)

Kannst du verwenden o" e"?
Martin Ender

Und stattdessen +1kannst du verwenden l. 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/HwA
Martin Ender

@MartinEnder Das funktioniert nicht, wenn Sie eines der 1s in der ersten Zeile entfernen .
mbomb007

Ah richtig, die haben mich trotzdem gestört
Martin Ender

12

> <> , 42 38 34 Bytes

Probieren Sie es online!

Vielen Dank an @Martin Ender und @Teal Pelican für das Abschneiden von 8 Bytes!

<<;?=*4o" e"lnll/
 ;?=*4o" e"lnll<

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:

          lnll   Prints the size of the stack + 1 and pushes the stack size twice
     o" e"       Prints a space and pushes 101
   *4            Multiplies to get 404
;?=              If the number we just printed was 404, end the program

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 \nZeichen. Dies wird auch berücksichtigt, da es diesen Code erzeugt:

<<;?=*4o" e"lnll/ ;?)*4o" e"lnll<

Jetzt haben wir eine Kopie der Originalschleife ;?=*4o" e"lnllan 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.


1
Wirklich schöne Möglichkeit, es auf 2 Zeilen zu reduzieren. Das einzige Problem, das ich sehen kann, ist, dass es nicht 38 Bytes ist, sondern 42? Reduzierung des inneren Codes auf; ;? = * 4o "e": n: + 1l würde es jedoch auf 38 Bytes reduzieren. Dies platziert nur Ihre 84 * innerhalb der Zeichenfolge "e" statt getrennt.
Teal

1
Sie können das :+1und das andere :durch ljedes ersetzen .
Martin Ender

Ja, danke euch beiden!
MildlyMilquetoast

;?=*4o" e"n:llfunktioniert auch.
mbomb007

11

Ein Birnbaum , 34 Bytes

Das Programm enthält Steuerzeichen, daher hier ein xxdDump:

00000000: 7072 696e 7420 312e 2e34 3034 2327 108a  print 1..404#'..
00000010: af70 7269 6e74 2031 2e2e 3430 3423 2710  .print 1..404#'.
00000020: 8aaf                                     ..

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 partridgein 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 printAussage (die nur die Zahlen zusammenfasst) die printAussage 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.


9

Befunge 98 , 34 Bytes

Probieren Sie es online!

<<.:@k`*4e':+1[

2.:@k`*4e':+1<^^j

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

<<                 Reverses code direction, sending IP to right
               [   Turns the IP left, into the ^, which reverses it.
                   It then hits this again, turning left to go West. (No-op)
            :+1    Adds 1 to the sum
        *4e'       Pushes 404
     @k`           Ends the program if (sum > 404)
   .:              Prints the sum

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!)


Was passiert mit leeren Zeilen im Code? Vielleicht könnten Sie den Zeilenvorschub verdoppeln, um ihn auch immun zu machen
masterX244

Du hast vollkommen recht @ masterX244 danke! Daran habe ich nicht gedacht.
MildlyMilquetoast

Lol, habe die Sprache nie benutzt, aber aus irgendeinem Grund hat mir ein sechster Sinn diese Idee gegeben ...
masterX244

5

Befunge-93, 54 51 Bytes

Vielen Dank an Mistah Figgins , die mir 3 Bytes gespart hat.

111111111111111vv
+1_@#-*4"e":.:<<
+1_@#-*4"e":.:<<

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 vleitet 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 vPfeile 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 Pfad vdarü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.


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.
MildlyMilquetoast

5

JavaScript + HTML + Stack Snippets, 167 158 154 Bytes

Missbrauch der Tatsache, dass JavaScript in Stack-Snippets auf einer Webseite in einem <script>Element platziert wird.

or(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)</script></script><script>for(x="",i=405,d=document;--i;)d[i]||(x=d[i]=i+' '+x);d.write(x)


@ Flp.Tkc Behoben.
user2428118

4

Eigentlich 18 Bytes

:404::404kMkMMRRSS

Eigentlich ist eine Stack-basierte Golfsprache.

Erläuterung der beteiligten Befehle (wie sie im obigen Kontext funktionieren):

Numbers are indicated by round brackets () and lists by square brackets []

:         - pushes the longest string of characters in '0123456789+-.ij' as a numeric
k         - pop all the elements on the stack into a list [l] and push [l]
M         - pop [l], push max([l])
            pop (a), push (a)
R         - pop [l], push reverse([l])
            pop (a), push range([1,a])
S         - pop [a], push sorted([a])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.