Program samonaprawiający się z wykrywaniem błędów

14

Twoim zadaniem jest stworzenie programu, w którym jeśli jeden znak zostanie usunięty, wykryje, który znak został usunięty, a następnie ponownie wstawi usunięty znak do własnego pliku źródłowego.

Na przykład, jeśli twój program jest RadiationHardenedi jest zmodyfikowany RadiaionHardened, to twój program musi wyprowadzić, że zmodyfikowany został 5. bajt (indeksowany 0), a następnie źródło programu musi być RadiationHardenednatychmiast po wykonaniu.

Uwagi i zasady

  • Możesz założyć, że dokładnie jeden znak został usunięty z kodu źródłowego przed wykonaniem. Zachowanie niezmodyfikowanego programu jest niezdefiniowane.
  • Możesz założyć, że zmieniony bajt zostanie usunięty, nie transponowany, wstawiony ani zastąpiony.
  • W przypadku serii wielokrotności tego samego znaku możesz zgłosić pierwszy lub ostatni indeks serii, ale zachowaj spójność co do tego, którego używasz. Na przykład baaadusunięcie, aby baadzgłosić 1 lub 3 (indeksowane zerem), ale musi być takie samo w całym programie.
  • Nie musisz zapisywać całego źródła do własnego pliku. Wystarczy ponownie wstawić usunięty bajt.
  • W przeciwieństwie do typowych zasad dla utwardzanych promieniowaniem quinów, wykrywanie zmienionego bajtu po odczytaniu własnego kodu źródłowego programu jest uczciwą grą.
  • Zmieniony indeks bajtów można wydrukować w dowolnym rozsądnym formacie. Bądź konsekwentny w kwestii, czy jest indeksowany 0, indeksowany 1 czy jakikolwiek inny zapis. Możesz nawet wypisać liczbę w ciągu szablonu.

To jest więc wygrywa najkrótszy program.

Powodzenia!

EDYCJA 1: zmieniono wymaganie z zamiany na usunięcie

EDYCJA 2: dodano regułę dla serii duplikatów

Wołowina
źródło
4
Jest to o wiele trudniejsze niż samodzielne usuwanie . Większość nie-esolangów jest oczywiście niedostępna (zazwyczaj nie jest możliwe napisanie żadnego programu, który pozostaje poprawny pod względem składniowym przy jakiejkolwiek modyfikacji jednobajtowej). Nawet fungeoidy są przeważnie udaremnione (nic nie mogą zrobić, jeśli 0 bajt zostanie zmieniony na polecenie zakończenia programu ). Myślałem, że może jedno z dwóch adresów IP może przetrwać w czegoś takiego jak rozszczepienie, ale jego *polecenie zabija wszystkie adresy IP. Kardynał też nie może tego zrobić @.
Lynn
Można to zmienić w miejsce, w code-challengektórym każdy program może zadeklarować listę bajtów, które są chronione przed promieniowaniem (ale nie więcej niż - powiedzmy - 50% całkowitego rozmiaru). Prostym systemem oceniania może być policzenie każdego bajtu chronionego przed promieniowaniem jako 10 bajtów lub coś w tym rodzaju.
Arnauld
(Ale może to prowadzić do banalnych i niezbyt interesujących odpowiedzi.)
Arnauld
1
@JoKing, zgłaszanie jako brakujące jest w porządku, o ile jest spójne.
Beefster
2
„Możesz wymagać, aby plik miał nazwę o określonej nazwie i był uruchamiany z określonego katalogu” - bądź ostrożny, ktoś może po prostu wymagać, aby nazwa pliku była poprawnym programem ...
tylko ASCII

Odpowiedzi:

9

Befunge-98 (FBBI) , 344 296 248 bajtów

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

Wypróbuj online!

Weryfikacja!

Befunge-98 jest pierwszym ezoterycznym językiem, który udało mi się znaleźć, który był zarówno dwuwymiarowy, jak i miał wyjście pliku. Jest to pełne rozwiązanie (z końcowym znakiem nowej linii) przechowywane w pliku o nazwie tabulatora. Wyprowadza jako indeksowane 0 i wyświetla pierwszy indeks w szeregu znaków (chociaż zawsze są tylko pary).

Do zrobienia jest kilka golfów, zwłaszcza, że ​​w kodzie jest 15 no-opów , teraz tylko jeden no-op! Będę pracował nad tym, aby ten skrót był krótszy, aby uzyskać maksymalnie 200 bajtów lub mniej.

Jo King
źródło
Och wow! Nie sądziłem, że to możliwe
MilkyWay90
3

Unefunge-98 (PyFunge) , 118 bajtów

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

Wypróbuj online!

Weryfikacja!

Podczas gry w moją odpowiedź Befunge-98 zdałem sobie sprawę, że mogę zaoszczędzić trochę bajtów, przenosząc ją do Unefunge, ponieważ musiałbym martwić się tylko o jeden wymiar, a nie o dwa. Otworzyło to również wiele możliwych skrótów i pól golfowych, co znacznie zmniejszyło nowe rozwiązanie .

Objaśnienie (zduplikowane):

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
źródło