Programa de autocorreção com detecção de erros

14

Sua tarefa é criar um programa em que, se algum caractere for excluído, ele detectará qual caractere foi excluído e, em seguida, reinsira o caractere excluído em seu próprio arquivo de origem.

Por exemplo, se o seu programa é RadiationHardenede é modificado para RadiaionHardened, então ele deve produzir que o quinto byte (indexado 0) foi modificado e a fonte do programa deve estar RadiationHardenedimediatamente após a execução.

Notas e regras

  • Você pode assumir que exatamente um caractere foi excluído no código-fonte antes da execução. O comportamento do programa não modificado é indefinido.
  • Você pode assumir que o byte alterado será excluído, não transposto, inserido ou substituído.
  • No caso de uma execução de múltiplos do mesmo caractere, você pode relatar o primeiro ou o último índice da execução, mas seja consistente com o que usa. Por exemplo, baaada exclusão de baadpode reportar 1 ou 3 (zero indexado), mas deve ser a mesma durante todo o programa.
  • Você não precisa gravar a fonte inteira em seu próprio arquivo. Você só precisa reinserir o byte excluído.
  • Ao contrário das regras típicas para quines reforçados com radiação, detectar o byte alterado da leitura do código-fonte do próprio programa é um jogo justo.
  • Você pode gerar o índice de bytes alterado através de qualquer formato razoável. Seja consistente sobre se é 0 ou 1 ou qualquer outra notação. Você pode até gerar um número dentro de uma string de modelo.

Isso é então o programa mais curto vence.

Boa sorte!

EDIT1: requisito alterado de substituição para exclusão

EDIT2: regra adicionada para execuções de duplicatas

Beefster
fonte
4
Isso é muito mais difícil do que lidar com exclusões arbitrárias . A maioria dos não-esolangs está obviamente fora (geralmente é impossível escrever qualquer programa que permaneça sintaticamente válido sob qualquer modificação de um byte). Até os Fungeoids são frustrados (eles não podem fazer nada se o 0º byte for alterado para um comando de encerramento do programa ). Eu pensei que talvez um dos dois IPs pudesse sobreviver em algo como Fission, mas seu *comando mata todos os IPs. O cardeal também não pode fazê-lo, por causa de @.
Lynn
Isso pode ser transformado em um code-challengelocal em que cada programa pode declarar uma lista de bytes protegidos contra radiação (mas não mais do que, digamos, 50% do tamanho total). Um sistema simples de pontuação pode contar cada byte protegido por radiação como 10 bytes, ou algo assim.
Arnauld
(Mas isso pode levar a algumas respostas triviais e não muito interessante.)
Arnauld
1
@JoKing, reportar como ausente é bom, desde que seja consistente.
Beefster
2
"Você pode exigir que o arquivo seja nomeado com um determinado nome e seja executado em um diretório específico" - tenha cuidado, alguém pode exigir que o nome do arquivo seja o programa correto ...
ASCII-only

Respostas:

9

Befunge-98 (FBBI) , 344296248 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@@

Experimente online!

Verificação!

O Befunge-98 é a primeira linguagem esotérica que eu descobri que era 2D e tinha saída de arquivo. Esta é uma solução completa (com uma nova linha à direita) armazenada em um arquivo nomeado como caractere de tabulação. Ele gera como indexado 0 e gera o primeiro índice em uma sequência de caracteres (embora haja apenas pares).

Existem alguns campos de golfe a serem feitos, especialmente porque existem 15 no-ops no código , agora apenas um no-op! Vou trabalhar para tornar isso mais curto, com o objetivo de chegar a 200 bytes ou menos.

Brincadeira
fonte
Oh uau! Eu não achava que isso era possível
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@@

Experimente online!

Verificação!

Enquanto jogava minha resposta no Befunge-98, percebi que poderia economizar alguns bytes transferindo-o para o Unefunge, já que eu precisaria apenas me preocupar com a dimensão única e não com as duas. Isso também abriu muitos atalhos e campos de golfe possíveis, o que tornou a nova solução muito menor.

Explicação (desduplicada):

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
Brincadeira
fonte