Programme d'auto-réparation de détection d'erreur

14

Votre tâche consiste à créer un programme où, si un caractère est supprimé, il détectera le caractère supprimé, puis réinsérera le caractère supprimé dans son propre fichier source.

Par exemple, si votre programme l'est RadiationHardenedet qu'il est modifié en RadiaionHardened, alors votre programme doit sortir que le 5ème octet (indexé 0) a été modifié et alors la source du programme doit être RadiationHardenedimmédiatement après l'exécution.

Notes et règles

  • Vous pouvez supposer qu'exactement un caractère a été supprimé dans le code source avant l'exécution. Le comportement du programme non modifié n'est pas défini.
  • Vous pouvez supposer que l'octet modifié sera supprimé, non transposé, inséré ou remplacé.
  • Dans le cas d'une exécution de plusieurs du même caractère, vous pouvez signaler le premier ou le dernier index de l'exécution, mais être cohérent sur ce que vous utilisez. Par exemple, baaadêtre supprimé de baadpeut signaler 1 ou 3 (indexé zéro), mais doit être le même tout au long du programme.
  • Vous n'avez pas besoin d'écrire la source entière dans son propre fichier. Il vous suffit de réinsérer l'octet supprimé.
  • Contrairement aux règles typiques pour les quines durcies aux radiations, détecter l'octet modifié à partir de la lecture du code source du programme est un jeu équitable.
  • Vous pouvez sortir l'index d'octets modifié à travers n'importe quel format raisonnable. Soyez cohérent quant à savoir s'il est indexé 0 ou indexé 1 ou toute autre notation. Vous pouvez même sortir un nombre dans une chaîne de modèle.

C'est le donc le programme le plus court l'emporte.

Bonne chance!

EDIT1: modification de l'exigence de remplacement à suppression

EDIT2: règle ajoutée pour les exécutions de doublons

Beefster
la source
4
C'est beaucoup plus difficile que de gérer des suppressions arbitraires . La plupart des non-esolangs sont évidemment hors (il est généralement impossible d'écrire tout programme qui reste syntactially valide sous toute modification d' un octet). Même les Fungeoids sont pour la plupart contrecarrés (ils ne peuvent rien faire si le 0e octet est changé en une commande de programme quit ). Je pensais que peut-être une des deux IP pourrait survivre dans quelque chose comme Fission mais sa *commande tue toutes les IP. Le cardinal ne peut pas le faire non plus, à cause de @.
Lynn
Cela pourrait être transformé en un code-challengeoù chaque programme est autorisé à déclarer une liste d'octets qui sont protégés contre les radiations (mais pas plus - disons - 50% de la taille totale). Un système de notation simple pourrait être de compter chaque octet protégé contre les radiations comme 10 octets, ou quelque chose comme ça.
Arnauld
(Mais cela peut conduire à des réponses triviales et pas très intéressantes.)
Arnauld
1
@JoKing, signaler soit comme manquant est correct, tant qu'il est cohérent.
Beefster
2
"Vous pouvez exiger que le fichier soit nommé d'un certain nom et soit exécuté à partir d'un répertoire spécifique" - attention, quelqu'un peut simplement exiger que le nom de fichier soit le bon programme ...
ASCII uniquement

Réponses:

9

Befunge-98 (FBBI) , 344 296 248 octets

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

Essayez-le en ligne!

Vérification!

Befunge-98 est le premier langage ésotérique que j'ai pu trouver qui était à la fois 2D et avait une sortie de fichier. Il s'agit d'une solution complète (avec une nouvelle ligne de fin) stockée dans un fichier nommé en tant que caractère de tabulation. Il sort en tant qu'index 0 et sort le premier index d'une série de caractères (bien qu'il n'y ait que des paires).

Il y a quelques golfs à faire, d' autant plus qu'il y a 15 no-ops dans le code , maintenant juste un no-op! Je vais travailler sur ce raccourcissement, dans le but d'atteindre ou en dessous de 200 octets.

Jo King
la source
Oh wow! Je ne pensais pas que c'était possible
MilkyWay90
3

Unefunge-98 (PyFunge) , 118 octets

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

Essayez-le en ligne!

Vérification!

En jouant à ma réponse Befunge-98, j'ai réalisé que je pouvais économiser quelques octets en la portant sur Unefunge, car je n'aurais qu'à me soucier d'une dimension plutôt que des deux. Cela a également ouvert de nombreux raccourcis et golfs possibles, ce qui a rendu la nouvelle solution beaucoup plus petite.

Explication (dédoublonnée):

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
Jo King
la source