Обнаружение ошибок Самовосстанавливающаяся Программа

14

Ваша задача - создать программу, в которой, если будет удален какой-либо один символ, он обнаружит, какой символ был удален, а затем повторно вставит удаленный символ в свой собственный исходный файл.

Например, если ваша программа RadiationHardenedи изменена на RadiaionHardened, то ваша программа должна вывести, что 5-й байт (с 0 индексами) был изменен, а затем источник программы должен быть RadiationHardenedсразу после выполнения.

Примечания и правила

  • Вы можете предположить, что ровно один символ был удален в исходном коде перед выполнением. Поведение неизмененной программы не определено.
  • Вы можете предположить, что измененный байт будет удален, не транспонирован, вставлен или заменен.
  • В случае серии, состоящей из нескольких одинаковых символов, вы можете сообщить либо о первом, либо о последнем индексе серии, но не забывайте о том, что вы используете. Например baaad, удаление baadможет указывать либо 1, либо 3 (с нулевым индексированием), но оно должно быть одинаковым во всей программе.
  • Вам не нужно выписывать весь источник в свой собственный файл. Вам нужно только повторно вставить удаленный байт.
  • В отличие от типичных правил для радиационно-стойких квин, обнаружение измененного байта при чтении собственного исходного кода программы является честной игрой.
  • Вы можете вывести измененный индекс байтов в любом приемлемом формате. Будьте последовательны относительно того, является ли это 0-индексированным или 1-индексированным или любым другим примечанием. Вы даже можете вывести число в строке шаблона.

Это поэтому выигрывает самая короткая программа.

Удачи!

EDIT1: изменено требование от замены к удалению

EDIT2: добавлено правило для прогонов дубликатов

Beefster
источник
4
Это намного сложнее, чем обработка произвольных удалений . Большинство не esolangs явно отсутствуют (обычно невозможно написать любую программу, которая остается синтаксически допустимой при любой однобайтовой модификации). Даже Fungeoids в основном сорваны (они ничего не могут сделать, если 0-й байт заменен на команду выхода из программы ). Я думал, что, может быть, один из двух IP может выжить в чем-то вроде Fission, но его *команда убивает все IP. Кардинал тоже не может этого сделать из-за @.
Линн
Это может быть превращено в то, code-challengeгде каждой программе разрешено объявлять список байтов, которые защищены от излучения (но не более - скажем, - 50% от общего размера). Простая система подсчета очков может состоять в том, чтобы считать каждый защищенный от излучения байт как 10 байтов или что-то в этом роде.
Арно
(Но это может привести к некоторым банальным и не очень интересным ответам.)
Арно
1
@JoKing, сообщать о том, что пропал без вести - это хорошо, если это не противоречит.
Бифстер
2
«Вы можете требовать, чтобы файл имел имя с определенным именем и запускался из определенного каталога» - будьте осторожны, кто-то может просто потребовать, чтобы имя файла было правильной программой ...
Только для ASCII

Ответы:

9

Befunge-98 (FBBI) , 344 296 248 байт

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

Попробуйте онлайн!

Проверка!

Befunge-98 - это первый эзотерический язык, который я смог найти, он был 2D и имел выходной файл. Это полное решение (с завершающим переводом строки), хранящееся в файле с именем символа табуляции. Он выводится как 0-индексированный и выводит первый индекс в серии символов (хотя есть только когда-либо пары).

Нужно сделать несколько гольфов, тем более, что в коде 15 бездействующих операций , теперь только один безоперационный! Я буду работать над тем, чтобы сделать это короче, с целью получения или меньше 200 байтов.

Джо Кинг
источник
Ух ты! Я не думал, что это было возможно
MilkyWay90
3

Unefunge-98 (PyFunge) , 118 байт

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

Попробуйте онлайн!

Проверка!

Играя в гольф мой ответ Befunge-98, я понял, что могу сэкономить несколько байтов, перенеся их в Unefunge, так как мне придется беспокоиться только об одном измерении, а не о двух. Это также открыло много возможных ярлыков и гольфов, что сделало новое решение намного меньше.

Пояснение (без дублирования):

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
Джо Кинг
источник