Programa de auto reparación de detección de errores

14

Su tarea es crear un programa en el que si se elimina cualquier carácter, detectará qué carácter se eliminó y luego volverá a insertar el carácter eliminado en su propio archivo fuente.

Por ejemplo, si su programa es RadiationHardenedmodificado y está modificado RadiaionHardened, entonces su programa debe indicar que se modificó el 5to byte (indexado a 0) y luego la fuente del programa debe estar RadiationHardenedinmediatamente después de la ejecución.

Notas y reglas

  • Puede suponer que se eliminó exactamente un carácter en el código fuente antes de la ejecución. El comportamiento del programa no modificado no está definido.
  • Puede suponer que el byte modificado se eliminará, no se transpondrá, insertará o reemplazará.
  • En el caso de una ejecución de múltiplo del mismo carácter, puede informar sobre el primer o el último índice de la ejecución, pero sea coherente con el uso que haga. Por ejemplo, si baaadse elimina baadpuede informar 1 o 3 (indexado a cero), pero debe ser el mismo en todo el programa.
  • No necesita escribir toda la fuente en su propio archivo. Solo necesita volver a insertar el byte eliminado.
  • A diferencia de las reglas típicas para quines endurecidas por radiación, detectar el byte modificado al leer el código fuente del programa es un juego justo.
  • Puede generar el índice de bytes modificado a través de cualquier formato razonable. Sea coherente acerca de si está indexado 0 o indexado 1 o cualquier otra notación. Incluso puede generar un número dentro de una cadena de plantilla.

Este es el por lo que gana el programa más corto.

¡Buena suerte!

EDITAR1: se modificó el requisito de reemplazo a eliminación

EDIT2: regla agregada para ejecuciones de duplicados

Carne de res
fuente
44
Esto es mucho más difícil que manejar eliminaciones arbitrarias . La mayoría de los que no son esolangs están obviamente fuera (por lo general, es imposible escribir cualquier programa que siga siendo sintácticamente válido bajo cualquier modificación de un byte). Incluso los Fungeoids se frustran en su mayoría (no pueden hacer nada si el byte 0 se cambia a un comando para salir del programa ). Pensé que tal vez una de las dos IP podría sobrevivir en algo como Fission, pero su *comando mata todas las IP. Cardinal tampoco puede hacerlo, por eso @.
Lynn
Esto podría convertirse en un lugar code-challengedonde cada programa puede declarar una lista de bytes que están protegidos contra la radiación (pero no más de, digamos, el 50% del tamaño total). Un sistema de puntuación simple podría ser contar cada byte protegido contra la radiación como 10 bytes, o algo así.
Arnauld
(Pero eso puede dar lugar a algunas respuestas triviales y no muy interesantes.)
Arnauld
1
@JoKing, informar ya sea como faltante está bien, siempre y cuando sea consistente.
Beefster
2
"Puede requerir que el archivo tenga un nombre determinado y que se ejecute desde un directorio específico" - tenga cuidado, alguien puede requerir que el nombre de archivo sea el programa correcto ...
Solo ASCII

Respuestas:

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

Pruébalo en línea!

¡Verificación!

Befunge-98 es el primer lenguaje esotérico que pude encontrar que era 2D y tenía salida de archivo. Esta es una solución completa (con una nueva línea final) almacenada en un archivo denominado como un carácter de tabulación. Sale como indexado a 0, y genera el primer índice en una serie de caracteres (aunque solo hay pares).

Hay algunos campos de golf para hacer, especialmente porque hay 15 no-ops en el código , ¡ahora solo un no-op! Trabajaré para acortar esto, con el objetivo de llegar a 200 bytes o menos.

Jo King
fuente
¡Oh wow! No pensé que esto fuera posible
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@@

Pruébalo en línea!

¡Verificación!

Mientras jugaba mi respuesta Befunge-98, me di cuenta de que podía guardar algunos bytes al transferirlos a Unefunge, ya que solo tendría que preocuparme por la única dimensión en lugar de las dos. Esto también abrió muchos atajos y campos de golf posibles, lo que hizo que la nueva solución fuera mucho más pequeña.

Explicación (deduplicada):

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
fuente