Fehlererkennendes Selbstreparaturprogramm

14

Ihre Aufgabe ist es, ein Programm zu erstellen, in dem beim Löschen eines Zeichens erkannt wird, welches Zeichen gelöscht wurde, und das gelöschte Zeichen dann erneut in die eigene Quelldatei eingefügt wird.

Wenn zum Beispiel Ihr Programm RadiationHardenedgeändert wurde RadiaionHardened, muss Ihr Programm ausgeben, dass das 5. Byte (0-indiziert) geändert wurde, und anschließend muss die Programmquelle angegeben werdenRadiationHardened unmittelbar nach der Ausführung .

Notizen und Regeln

  • Sie können davon ausgehen, dass vor der Ausführung genau ein Zeichen im Quelltext gelöscht wurde. Das Verhalten für das nicht geänderte Programm ist undefiniert.
  • Sie können davon ausgehen, dass das geänderte Byte gelöscht, nicht transponiert, eingefügt oder ersetzt wird.
  • Im Fall eines Laufs mit mehreren Zeichen desselben Charakters können Sie entweder den ersten oder den letzten Index des Laufs melden, aber konsistent darüber sein, welchen Sie verwenden. Wenn Sie beispielsweise baaadgelöscht werden, baadum entweder 1 oder 3 zu melden (mit einem Index von Null), muss dies jedoch für das gesamte Programm gleich sein.
  • Sie müssen nicht die gesamte Quelle in eine eigene Datei schreiben. Sie müssen nur das gelöschte Byte erneut einfügen.
  • Im Gegensatz zu den typischen Regeln für strahlungsgehärtete Quines ist das Erkennen des geänderten Bytes beim Lesen des programmeigenen Quellcodes ein faires Spiel.
  • Sie können den geänderten Byteindex in jedem geeigneten Format ausgeben. Seien Sie konsistent, ob es sich um eine 0-indizierte oder eine 1-indizierte oder eine andere Schreibweise handelt. Sie können sogar eine Zahl in einer Vorlagenzeichenfolge ausgeben.

Dies ist also gewinnt das kürzeste Programm.

Viel Glück!

EDIT1: Anforderung von Ersetzung auf Löschung geändert

EDIT2: Regel für Dubletten hinzugefügt

Beefster
quelle
4
Dies ist viel schwieriger als die Bearbeitung von willkürlichen Löschvorgängen . Die meisten Nicht-Esolangs sind offensichtlich out (es ist normalerweise unmöglich, ein Programm zu schreiben , das bei einer Ein-Byte-Änderung syntaktisch gültig bleibt ). Sogar Fungeoids werden meistens vereitelt (sie können nichts tun, wenn das 0. Byte in einen Befehl zum Beenden des Programms geändert wird ). Ich dachte, vielleicht könnte eine von zwei IPs in so etwas wie Fission überleben, aber ihr *Befehl tötet alle IPs. Cardinal kann es auch nicht, weil @.
Lynn
Dies könnte dazu führen, dass code-challengejedes Programm eine Liste von Bytes deklarieren darf, die gegen Strahlung geschützt sind (aber nicht mehr als - sagen wir - 50% der Gesamtgröße). Ein einfaches Bewertungssystem könnte darin bestehen, jedes strahlungsgeschützte Byte als 10 Bytes zu zählen, oder so ähnlich.
Arnauld
(Aber das kann zu einigen trivialen und nicht sehr interessanten Antworten führen.)
Arnauld
1
@JoKing, entweder als fehlend zu melden ist in Ordnung, solange es konsistent ist.
Beefster
2
"Möglicherweise muss die Datei einen bestimmten Namen haben und in einem bestimmten Verzeichnis ausgeführt werden." - Vorsicht, jemand kann nur verlangen, dass der Dateiname das richtige Programm ist ...
Nur ASCII

Antworten:

9

Befunge-98 (FBBI) , 344 296 248 Bytes

20020xxnngg33%%!!2200gg''00--3300gg33%%!!4400gg55%%!!22kk++55##rr55kk::00gg\\11pp00gg\\11++11pp22++00::pp00gg\\11++00gg--!!zz!!22**++00::gg00gg8844**--!!55++jj..''gg::00rr00::gg\\--..''220011''0011::''002211''223311''00441144kkppgg11001100::99oo@@

Probieren Sie es online!

Nachprüfung!

Befunge-98 ist die erste esoterische Sprache, die ich sowohl in 2D als auch mit Dateiausgabe finden konnte. Dies ist eine vollständige Lösung (mit einem nachgestellten Zeilenumbruch), die in einer Datei mit dem Namen eines Tabulatorzeichens gespeichert ist. Es wird als 0-indexiert ausgegeben und gibt den ersten Index in einer Reihe von Zeichen aus (obwohl es immer nur Paare gibt).

Es müssen ein paar Golfer gemacht werden, zumal der Code 15 No-Ops enthält , jetzt nur noch ein No-Op! Ich werde daran arbeiten, dies zu verkürzen, mit dem Ziel, auf oder unter 200 Bytes zu kommen.

Scherzen
quelle
Oh wow! Ich hätte nicht gedacht, dass dies möglich ist
MilkyWay90
3

Unefunge-98 (PyFunge) , 118 Bytes

22xx00##rr33kk::gg\\11--pp22++00ppgg\\11++gg--!!zz!!22**--00gg::gg8844**--!!22++jj##''rr++..gg''2200pp0011--00::99oo@@

Probieren Sie es online!

Nachprüfung!

Beim Golfen meiner Befunge-98-Antwort wurde mir klar, dass ich einige Bytes einsparen konnte, indem ich sie nach Unefunge portierte, da ich mich nur um die eine Dimension und nicht um die beiden kümmern musste. Dies eröffnete auch viele mögliche Abkürzungen und Golfplätze, was die neue Lösung sehr machte viel machte kleiner machte.

Erklärung (de-dupliziert):

2x        Set the delta of the movement to 2
          This means the pointer moves 2 cells every step
          This will also initialise a counter as 2 (unless a 2 has been removed)
  0       Create the cell counter  (This will be stored at cell 0)
   #r     Enter the loop
     3k:                 Create 3 more copies of the counter
        g                Get the cell at the counter's position
         \1-p            Put it in the cell before that position
             2+0p        Add 2 to the counter and put it in cell 0
                 g       Get the cell at the counter's position
                  \1+g   Get the next cell
                      -!z!2*      If they are identical, push two, else 0
                            --    Subtract it from the total counter
                              0g:g84*-!   If the next character is a space
                                       2+j  r   Exit loop
                                         j#'    Else jump back to the start

Once the loop is over
+      Add the negative counter to the total counter
 .     And print
   '20p          Replace the 2 in cell 0 that was overwritten
             o   Write to a file named
            9    Tab
       01-       The cells from -1 to
  g              The total number of cells
              @  And exit the program
Scherzen
quelle