Детектор радіації!


26

Запромінена радіацією програма - це програма, де, якщо якийсь символ коду буде видалений, програма все одно буде функціонувати однаково. Для цього питання ми пишемо програму, яка виявляє, коли вона опромінюється.

Напишіть програму або функцію, яка, коли будь-який байт буде видалений, отримана програма виведе цей байт і тільки цей байт. ( Ви можете виводити цей байт кілька разів, доки не виведете жоден інший байт )

Правила:

  • Програма повинна містити щонайменше 2 різних байти. (Немає рішень лише 0;)
  • Не має значення, що робить оригінальна програма
  • Немає читання власного вихідного коду.
  • Код буде набраний за кількістю окремих байтів, де виграє найбільша кількість. Наприклад , виграє abc= 3 бали, ababba= 2 бали abc.
    • Автоматичний вимикач - це менший кількість байтів з подальшим попереднім часом подання

Удачі!



Я пропустив цю лінію. Мені так соромно!
Мего

5
"Код буде набраний за кількістю чітко виражених символів, де виграє найвища сума". Я очікую, що більшість (якщо не всі) рішення десь матимуть певну форму рядка, яку вони можуть просто прокладати з довільними символами, фактично не змінюючи рішення (так що це зводиться лише до того, чи ваша мова обмежена ASCII, розширеним ASCII або Unicode) .
Мартін Ендер

3
... Пісочниця не ідеальна. :( / Ви можете просто виміряти "окремі байти" замість "окремих символів", тому що символи пов'язані з кодуванням та іншими проблемами.
user202729

1
Чи може програма взяти будь-який внесок?
gggg

Відповіді:


15

05AB1E , 9 7 байт (оцінка 3)

22'''rr

Спробуйте в Інтернеті!

Видалення a '

З будь-яким 'вилученим 22''rrрезультатом 22 стане першою справою в стеці і 'останньою справою в стеці, яка при переверненні двічі призводить до '.

Видалення r

З будь-яким rвидаленим,22'''r результатом 22 стає першою справою в стеці, 'другою справою в стеці і rостанньою справою в стеці. Це r, однак, передувало a, 'що робить його буквальним рядком "r"(на відміну від команди reverse stack), який неявно друкується.

Видалення a 2

З будь-яким 2видаленим,2'''rr це призведе до 2того будете першою справою в стеку, 'будучи 2-ю річчю в стеку і, нарешті r, останньою справою в стеку, яка при поверненні одного разу призводить до 2.

Тому ця відповідь справедлива. Без нічого вилученого він виводить ', що не має значення. Це працює і для будь-якого числа, крім 2.


Створено перевірку дійсності, ви можете використовувати його для змагання у 05AB1E *.

* Я не на 100% впевнений, скільки рішень можливо навіть у 05AB1E ...


Більш вірні рішення, які є гіршими або однаковими

  • 1-бальний (недійсний)
  • 2-бальна
    • '''''''VV, '''''''XX або'''''''<any command that pops a without pushing>x2
    • Будь-який непарний номер з 'вище 3, за яким слід будь-який парний номер № s1 (EG)'''''''''ssss ).
    • '''..з будь-якою кількістю періодів вище 1 і будь-яким непарним числом 'вище 2.
  • 3-бальна
    • '\\'''rr- така ж ідея, як 22'''rrале \"видалити останній елемент стека".

Нормальний вихід ', як ви кажете, не має значення для правил. Але це не дозволяє визначити номінальну мету виявлення аномалій, що трохи смішно.
gggg

1
@gggg Я досить впевнений, щонайменше ОДИН із моїх альтернатив не друкує нічого lol.
Чарівний восьминога Урна

1
@MagicOctopusUrn Вітаємо вас. Просто подумав, що я можу також редагувати замість коментування.
boboquack

@boboquack чи працював мій оригінальний тег (@boboquack), чи ви знайшли його, переглянувши публікацію ще раз? Я намагаюся з'ясувати, як працюють теги, коли користувач ніколи не коментував лол.
Чарівний восьминога Урна

@boboquack Я мав на увазі, чи отримували ви повідомлення від мого "спасибі"? Крім того, ми, мабуть, повинні видалити цю тему до мого +1 для вашого "Ви бажаєте".
Чарівний восьминіг Урна

9

Brainfuck, оцінка 3

Може бути неконкурентоспроможним, оскільки вихід відображається лише через дамп пам'яті.

+++++++++++++++++++++++++++++++++++++++++++++,-

Припустимо, що вхід порожній, і EOF залишає клітинку незмінною. Використовується інтерпретатор, який скидає пам'ять на такий вихід, як цей .

Видаліть плюс, і пам'ять є значенням unicode для "+", інакше це значення unicode для ",". Це, скоріше, швидше, ніж відповідь, ніж відповідь. Приблизно те саме з "-". Зловживає тим, що ці три символи знаходяться один за одним у наборі символів unicode.


Розумний, якщо бути чесним, не думайте, що це лазівка.
Чарівний восьминога Урна

Ви припускаєте, що EOF залишає клітинку незмінною, так?
Джо Кінг,

Так, і поки немає входу, це повинно бути добре 😊
Håvard Nygård,

Я спокушаюсь дозволити це, але чи є у вас інтерпретатор, який має дамп пам'яті, який виводить лише змінені клітини та залишає клітинку незмінною на EOF?
Джо Кінг,

1
copy.sh/brainfuck Цей повинен добре працювати. Просто запустіть його і натисніть "Переглянути пам'ять".
Håvard Nygård

9

Дерево груші, 256 байт, 975 байт

На жаль, питання, в значній мірі, вимагає оптимального рішення, щоб десь містити байт NUL (так як він повинен десь містити всі 256 байт). Це означає, що а) я не можу надати вам посилання TIO (оскільки TIO не любить NUL у програмах, або, принаймні, я не придумав способу ввести його, щоб мій браузер впорався), і b) I не може буквально вставити програму в Stack Exchange. Натомість я розмістив xxdреверсивний шестигранник, прихований за посиланням "фрагмент коду" внизу.

Пояснення

Ця програма складається з трьох однакових частин. (Об’єднання декількох однакових частин програми є для мене темою для програм, що .) Кожне дерево Груші вимагає десь контрольної суми, щоб перекладач міг знати, які частини програми виконувати; він обертає будь-яку частину програми, для якої контрольна сума вдається запустити її перед запуском (або друкує)a partridge якщо контрольна сума не відповідає). У цьому випадку ми маємо контрольну суму на кожну з трьох частин, і, таким чином, неопромінена частина переміститься до початку. Тож можна припустити, що програма складається з немодифікованої частини з наступними двома іншими частинами (одна з яких, можливо, була змінена).

Кожна частина починається з нового рядка, а потім продовжується наступним кодом (я додав пробіли та коментарі нижче):

$z{$/}++;      # In the hash table %z, set the key "\n" to 1
$/=$\=$@;      # Turn off newline handling when reading ($/ = undef);
               # Also don't add newlines when printing ($\ = undef)
               # $@ is set to undef by default
!$z{$_}?       #   If the current character is not in the hash table %z
  $z{$_}=1:    #   place it in the hash table %z
  delete$z{$_} #   else remove it from the hash table %z
for split//,   # for each character in
    <DATA>;    # the text appearing from the line beneath __DATA__ to EOF
print          # Print the following (no newline because $\ was undefined):
  keys%z>5?    # if the hash table %z contains more than 5 elements:
  "\n":        #   a newline; otherwise
  keys%z;      #   every key of %z, separated by spaces
__DATA__       # Start a string literal running from after this line to EOF

Після цього надходить копія кожного октету, який до цього часу не використовувався в програмі (суто для запуску рахунку), і нарешті контрольна сума. (Нічого нового рядка немає; частини починаються з нового рядка, але не закінчуються.)

Тут є три чіткі випадки:

  • Був видалений символ, відмінний від нового рядка . У цьому випадку в другій та третій частинах вона з’явиться непарною кількістю разів. Це означає, що вона буде додана та / або видалена з %zнепарної кількості разів, нарешті, в кінцевому підсумку в хеш-таблиці. Насправді це буде єдиний ключ у хеш-таблиці (оскільки рядок запускається після нового рядка другої частини до кінця третьої частини, а хеш-таблиця починається лише з одного нового рядка), так це ' Буде просто надруковано самостійно.
  • Перший чи третій новий рядок було видалено . У цьому випадку програма буде обернена таким чином, що вона є третьою з нових рядків, яких не вистачає, ефективно об'єднуючи другу та третю частини в один рядок. Буквальний рядок, через який можна отримати доступ, <DATA>містить кожен символ парне число разів, тому хеш-таблиця матиме свій оригінальний вміст, один новий рядок, і він буде надрукований.
  • Другий новий рядок було видалено . У цьому випадку програма не обертається (оскільки перша частина має дійсну контрольну суму), тому друга частина буде переміщена на ту саму лінію, що і перша частина. <DATA>починає читати лише з рядка нижче __DATA__, тому він побачить лише третю частину. У ньому більше п'яти символів, які з’являються непарною кількістю разів, тому це призведе до особливого випадку для друку нового рядка.

Перевірка

Останнє, що має бути перевірене на наявність будь-якої програми, опроміненої радіацією A Pear Tree, - це те, чи буде видалення випадковим чином викликати небажаний розділ коду, щоб перевірити суму правильно та повернути код у неправильне місце; враховуючи, що ми використовуємо 32-бітні контрольні суми, це малоймовірно, але не неможливо. Я використовував наступний сценарій грубої сили, щоб переконатися, що цього не відбувається при будь-якому видаленні:

use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Useqq=1;
$Data::Dumper::Terse=1;
$Data::Dumper::Indent=0;
undef $/;
$| = 1;
my $program = <>;

for my $x (0 .. (length($program) - 1)) {
    my $p = $program;
    my $removed = substr $p, $x, 1, "";
    alarm 4;
    say Dumper($p);
    run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
    if ($out ne $removed) {
        print "Unexpected output deleting character $x ($removed)\n";
        print "Output: {{{\n$out}}}\n";
        print "Errors: {{{\n$err}}}\n";
        exit;
    }
}

say $program;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$program, '>', \my $out, '2>', \my $err;
if ($out ne '') {
    print "Unexpected output not mutating\n";
    print "Output: {{{\n$out}}}\n";
    print "Errors: {{{\n$err}}}\n";
    exit;
}

say "All OK!";

Сценарій підтвердження підтверджує, що ця програма працює правильно.


7

Stax , 11 байт (оцінка 4)

'''cc'~~'dd

Запуск та налагодження в Інтернеті!

Мені честь отримати першу (хронологічно) відповідь на цей виклик із оцінкою, що перевищує або дорівнює 4. Можливо, оцінка може бути навіть вищою.

У Stax записаний рядковий літерал, який складається з одного символу ', так само, '', 'c, 'd, '~як і всі рядкові літерали. Відповідні команди для c dта ~засобів дублюють верхню частину основного стека, виводять верхню частину основного стека та спливають верхню частину основного стеку та натискають відповідно до вхідного стеку. Для цього завдання стек вводу не впливає на вихід і не є важливим, отже, ми можемо сказати dі ~є однаковими.

Пояснення

Найкраще розділити код на кілька частин і розглянути їх окремо.

Коли він не підроблений, '''ccпоштовхи буквальний 'і буквальні cдо основної стек і дублює вершину, так що стек буде (від дна) c,c,'.

Якщо його не підробляють, '~~натискає буквар, ~а потім вискакує (і натискає на вхідний стек), що в основному є неоперативним для основного стека.

Якщо його не підробляють, 'ddвиштовхує літерал, dа потім вискакує, ще одна неопераційна версія для основного стека.

В кінці програми, оскільки явного виводу не робиться, верхня частина основного стеку буде неявно роздрукована.

Якщо програма працює як є, остаточний стек залишається c,c,'і виводиться c.

Якщо перша частина стане ''cc, тоді у нас є буквальна 'та дві інструкції щодо копіювання, остаточний стек буде ',','. З огляду на те, що дві інші частини не є опціоном, результат буде' .

Якщо перша частина стає '''c, результат в основному збігається з незашкодженим, але той cне дублюється. Тож стека буде c,'. Після двох неопераційних вершина стека є c.

Тож ми можемо виявити радіацію в першій частині.

Друга частина і третя частина працюють точно так само. Я візьму третю частину як приклад.

Якщо третя частина підроблена, перші дві частини зберігаються як є, а стек перед запуском третьої частини - c,c,'

Якщо третя частина стає 'd, буквар dвисувається до вершини основного стеку і більше нічого не робиться. Тепер верхня частина основного стека, dяка буде виведена.

Якщо третя частина стає dd, два елементи вискакують з основного стека і тепер верхня частина стека є 'і виводиться.

Отже, ми можемо виявити випромінювання в третій частині. З тієї ж причини ми можемо виявити випромінювання у другій частині.


5

05AB1E , оцінка 2, 6 байт

„"""„„

Іноді друкується подвійний видалений символ. Не містить '.

Як це працює:

Видалення першого

"""„„

Спробуйте в Інтернеті!

Спочатку натискаємо на стек порожній рядковий рядок. Потім натискаємо „„, що друкується неявно.

Видалення a "

„""„„

Спробуйте в Інтернеті!

Спочатку натискаємо ""на стек з 2-char stringінструкцією. Тоді ми намагаємося отримати ще один рядок з двома символами, але це скасовано (я не зовсім впевнений, чому) і ""надрукується.

Видалення другого або третього

„"""„

Спробуйте в Інтернеті!

Спочатку натискаємо ""на стек з 2-char stringінструкцією. Потім натискаємо , що друкується неявно.


5

Желе , 5 байт, оцінка 2

”””ḷḷ

Спробуйте в Інтернеті!

З будь-яким видаленим:

””ḷḷ

Спробуйте в Інтернеті!

Символ починається з одного байта буквально. Ця програма починається з ””якої виходить рядок . Двійка бере це лівий аргумент. Рядок просто передається через два екземпляри .

З будь-яким видаленим:

”””ḷ

Спробуйте в Інтернеті!

У цій програмі ””виходить символ, потім видається ”ḷперсонаж, і тільки це виводиться.


Інші рішення

  • Багато інших персонажів, таких як aабо oпрацювали б замість цього надсилання.
  • ⁾⁾⁾⁾FFF. Це працює аналогічно. це як , але він запускає два байтові строковий літерал. "Опромінені" програми виводять видалений байт двічі, який вважався дійсним у коментарях.

Ось (набагато менше фантазії) желе-версія перевірки дійсності Magic Octopus Urn на перевірку дійсності. Лівий стовпець виводу - це видалений символ, а правий - результат результату програми.


Моя дійсність перевірки не thaaat фантазії. Це не вдається для іншого розміщеного рішення;).
Чарівний восьминога Урна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.