Виявлення помилок Програма саморемонту


14

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

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

Примітки та правила

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

Це тому найкоротша програма виграє.

Удачі!

EDIT1: змінена вимога від заміни до видалення

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


4
Це набагато складніше, ніж обробка довільних видалень . Більшість не-езолангів, очевидно, немає (зазвичай неможливо написати будь-яку програму, яка залишається синтаксично дійсною при будь -якій однобайтній модифікації). Навіть Fungeoids в основному зірвані (вони нічого не можуть зробити, якщо 0-й байт буде змінено на команду, яка виходить із програми ). Я подумав, що, можливо, один із двох ІС може вижити в чомусь подібному до Fission, але його *команда вбиває всі IP-адреси. Кардинал теж не може цього зробити @.
Лінн

Це може бути перетворено на те, code-challengeколи кожній програмі дозволено оголосити список байтів, захищених від випромінювання (але не більше - скажімо - 50% від загального розміру). Проста система балів може вважати кожен байт, захищений від радіації, 10 байтів, або щось подібне.
Арнольд

(Але це може призвести до деяких тривіальних і не дуже цікавих відповідей.)
Арнольд,

1
@JoKing, звітування або про відсутність є нормальним, якщо це послідовно.
Beefster

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 - це перша езотерична мова, яку я міг виявити, що вона була двовимірною та мала вихідний файл. Це повноцінне рішення (з новим рядком), що зберігається у файлі, названому як символ вкладки. Він виводить як 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.