Programma di autoriparazione che rileva errori


14

Il tuo compito è quello di creare un programma in cui se un carattere viene eliminato, rileverà quale carattere è stato eliminato e quindi reinserirà il carattere eliminato nel suo file di origine.

Ad esempio, se il programma è RadiationHardeneded è modificato inRadiaionHardened , il programma deve emettere che il 5 ° byte (indicizzato 0) è stato modificato e quindi la sorgente del programma deve essere RadiationHardenedimmediatamente dopo l'esecuzione.

Note e regole

  • Si può presumere che esattamente un carattere sia stato eliminato nel codice sorgente prima dell'esecuzione. Il comportamento per il programma non modificato non è definito.
  • Si può presumere che il byte modificato verrà eliminato, non trasposto, inserito o sostituito.
  • Nel caso di una corsa di multipli dello stesso carattere, puoi segnalare il primo o l'ultimo indice della corsa, ma sii coerente con quale usi. Ad esempio baaadessere cancellato inbaad può riportare 1 o 3 (zero indicizzato), ma deve essere uguale per tutto il programma.
  • Non è necessario scrivere l'intera fonte nel proprio file. Devi solo reinserire il byte cancellato.
  • A differenza delle regole tipiche per i quine temprati dalle radiazioni, rilevare il byte modificato dalla lettura del codice sorgente del programma è un gioco equo.
  • È possibile generare l'indice di byte modificato in qualsiasi formato ragionevole. Essere coerenti sul fatto che sia 0-indicizzato o 1-indicizzato o qualsiasi altra notazione. È anche possibile generare un numero all'interno di una stringa di modello.

Questo è quindi vince il programma più breve.

In bocca al lupo!

EDIT1: modifica del requisito dalla sostituzione alla cancellazione

EDIT2: aggiunta regola per esecuzioni di duplicati


4
Questo è molto più difficile della gestione di cancellazioni arbitrarie . La maggior parte dei non-esolang sono ovviamente fuori (di solito è impossibile scrivere qualsiasi programma che rimanga sintatticamente valido con qualsiasi modifica di un byte). Anche i Fungeoid sono per lo più contrastati (non possono fare nulla se il 0 ° byte viene cambiato in un comando di chiusura del programma ). Ho pensato che forse uno dei due IP potesse sopravvivere in qualcosa come Fission, ma il suo *comando uccide tutti gli IP. Anche il cardinale non può farlo, a causa di @.
Lynn

Questo potrebbe essere trasformato in un punto in code-challengecui ogni programma è autorizzato a dichiarare un elenco di byte protetti dalle radiazioni (ma non più del - diciamo - il 50% della dimensione totale). Un semplice sistema di punteggio potrebbe essere quello di contare ogni byte protetto dalle radiazioni come 10 byte, o qualcosa del genere.
Arnauld,

(Ma ciò può portare ad alcune risposte banali e non molto interessanti.)
Arnauld

1
@JoKing, segnalare che mancante va bene, purché sia ​​coerente.
Beefster,

2
"Potrebbe essere necessario assegnare al file un nome specifico ed essere eseguito da una directory specifica" - attenzione, qualcuno può semplicemente richiedere che il nome file sia il programma corretto ...
ASCII,

Risposte:


9

Befunge-98 (FBBI) , 344 296 248 byte

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@@

Provalo online!

Verifica!

Befunge-98 è il primo linguaggio esoterico che ho potuto trovare sia in 2D che con output di file. Questa è una soluzione completa (con una nuova riga finale) memorizzata in un file denominato come carattere di tabulazione. Emette come 0-indicizzato e genera il primo indice in una sequenza di caratteri (anche se ci sono solo coppie).

Ci sono alcuni campi da golf, soprattutto perché ci sono 15 no-op nel codice , ora solo uno no-op! Lavorerò per rendere questo più breve, con l'obiettivo di raggiungere o meno di 200 byte.


Oh wow! Non pensavo fosse possibile
MilkyWay90

3

Unefunge-98 (PyFunge) , 118 byte

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

Provalo online!

Verifica!

Mentre giocavo a golf con la mia risposta di Befunge-98, mi sono reso conto che avrei potuto salvare alcuni byte portandolo su Unefunge, poiché avrei dovuto preoccuparmi solo di una dimensione piuttosto che delle due. Ciò ha anche aperto molte possibili scorciatoie e campi da golf, il che ha reso la nuova soluzione molto più piccola.

Spiegazione (deduplicazione):

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.