Детектор радиации!


26

Радиационно-стойкая программа - это программа, в которой, если какой-либо символ кода будет удален, программа все равно будет работать так же. На этот вопрос мы напишем программу, которая определяет, когда она облучается.

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

Правила:

  • Программа должна содержать как минимум 2 разных байта. (Нет решений только 0s;)
  • Неважно, что делает оригинальная программа
  • Нет чтения вашего собственного исходного кода.
  • Код будет оцениваться по количеству отдельных байтов, в которых побеждает наибольшее количество. Например, abc= 3 балла, ababba= 2 балла, abcвыигрывает.
    • Tie-breaker - это меньшее число байтов, за которым следует более раннее время отправки

Удачи!



Я пропустил эту линию. Мне стыдно!
Мего

5
«Код будет оцениваться по количеству отдельных символов, где выигрывает наибольшее количество». Я ожидаю, что большинство (если не все) решения будут иметь некоторую форму строки, которую они могут просто дополнить произвольными символами без фактического изменения решения (поэтому все сводится к тому, ограничен ли ваш язык ASCII, расширенным ASCII или Unicode) ,
Мартин Эндер

3
... Песочница не идеальна. :( / Вы можете просто измерять «отдельные байты» вместо «различных символов», потому что символы связаны с кодировкой и другими проблемами.
user202729

1
Может ли программа принять любой вклад?
gggg

Ответы:


15

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

22'''rr

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

Удаление '

Если 'удалить все, 22''rrто 22 будет первым в стеке, а 'последним - последним в стеке, что при обратном обращении приведет к '.

Удаление r

Если все rудалить, 22'''rрезультат 22 будет первым в стеке, 'вторым в стеке и rпоследним в стеке. Этому r, однако, предшествовал a, 'что делает его литеральной строкой "r"(в отличие от команды reverse stack), которая неявно печатается.

Удаление 2

При 2удалении любой из них 2'''rrстанет первым в 2стеке, 'вторым в стеке и, наконец r, последним в стеке, что при обратном обращении приводит к 2.

Следовательно, этот ответ действителен. Ничего не удаляется, это выводит ', что не имеет значения. Это работает для любого числа, кроме 2.


Создал проверку достоверности, вы можете использовать его, чтобы конкурировать в 05AB1E *.

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


Более правильные решения, которые хуже или те же

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

Нормальный вывод не 'имеет значения по правилам, как вы говорите. Но это лишает законной силы номинальную цель обнаружения аномалий, что немного забавно.
gggg

1
@gggg Я уверен, что, по крайней мере, ОДНА из моих альтернатив ничего не печатает.
Волшебная урна осьминога

1
@MagicOctopusUrn Пожалуйста. Просто подумал, что я могу отредактировать вместо того, чтобы комментировать.
boboquack

@boboquack сработал мой оригинальный тег (@boboquack), или вы нашли его, просмотрев пост снова? Я пытаюсь выяснить, как работают теги, когда пользователь никогда не комментировал.
Волшебная урна осьминога

@boboquack Я имел в виду, ты получил уведомление от моего "спасибо"? Кроме того, мы, вероятно, должны удалить эту тему до моего +1 для вашего "Добро пожаловать".
Волшебная урна осьминога

9

Brainfuck, оценка 3

Может быть неконкурентным, так как вывод виден только через дамп памяти.

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

Предполагая, что ввод пуст и EOF оставляет ячейку без изменений. Использует интерпретатор, который выводит память на вывод, такой как этот .

Удалите плюс, и память является значением Unicode для «+», иначе это значение Unicode для «,». Хотя это скорее правило, а не ответ. Примерно то же самое с "-". Нарушает тот факт, что эти три символа следуют друг за другом в наборе символов Юникод.


Умный, если честно, не думайте, что это лазейка.
Волшебная Урна Осьминога

Вы предполагаете, что EOF оставляет клетку без изменений, да?
Джо Кинг,

Да, и до тех пор, пока не введен, он должен быть штраф 😊
Håvard Nygård

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

1
copy.sh/brainfuck Этот должен работать нормально. Просто запустите его и нажмите «Просмотр памяти».
Håvard Nygård

9

Груша, 256 различных байтов, 975 байтов

К сожалению, вопрос в значительной степени требует оптимального решения, чтобы где-то содержать байт NUL (поскольку он должен где-то содержать все 256 байтов). Это означает, что: а) я не могу дать вам ссылку на TIO (потому что TIO не нравится NUL в программах, или, по крайней мере, я не нашел способ набрать его, с которым может справиться мой браузер), и б) я не может вставить программу в Stack Exchange буквально. Вместо этого я поместил xxdобратимую hexdump, скрытую за ссылкой «фрагмент кода» ниже.

объяснение

Эта программа состоит из трех одинаковых частей. (Конкатенация нескольких идентичных частей программы является для меня темой в программах .) Каждому Грушевому дереву требуется контрольная сумма где-нибудь, чтобы дать интерпретатору понять, какие части программы нужно запустить; он вращает любую часть программы, для которой контрольная сумма успешно запускается перед запуском (или печатает, 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__, поэтому он увидит только третью часть. В нем более пяти символов, которые появляются нечетное количество раз, поэтому будет запускаться специальный случай для печати новой строки.

верификация

И последнее, что нужно проверить практически для любой программы Pear Tree, защищенной от радиации, - это случайное удаление случайным образом правильной контрольной суммы нежелательного участка кода и его поворота в неправильном месте; учитывая, что мы используем 32-битные контрольные суммы, это маловероятно, но не невозможно. Я использовал следующий скрипт brute-force, чтобы гарантировать, что это не произойдет при удалении:

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 байтов

„"""„„

Отпечатки удваивают удаленный символ иногда. Не содержит '.

Как это работает:

Удаление первого

"""„„

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

Сначала мы помещаем пустой стек в строку. Затем мы нажимаем „„, что печатается неявно.

Удаление "

„""„„

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

Сначала мы добавляем ""в стек 2-char stringинструкции. Затем мы пытаемся получить еще одну 2-символьную строку, но это прервано (я не совсем уверен, почему) и ""печатается.

Удаление второго или третьего

„"""„

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

Сначала мы добавляем ""в стек 2-char stringинструкции. Затем мы нажимаем , что печатается неявно.


5

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

”””ḷḷ

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

При любом удалении:

””ḷḷ

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

Символ начинает однобайтовый буквенный символ. Эта программа начинается с того, ””что дает строку . Двойка берет это левый аргумент. Строка просто передается через два экземпляра .

При любом удалении:

”””ḷ

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

В этой программе ””выдает символ, затем ”ḷвыдает символ, и только это выводится.


Другие решения

  • Многие другие персонажи, такие как aили oработали бы вместо этого представления.
  • ⁾⁾⁾⁾FFF, Это работает аналогичным образом. это как , но он запускает два байтовые строковый литерал. «Облученные» программы дважды выводят удаленный байт, который в комментариях был признан действительным.

Вот (гораздо менее навороченная) версия проверки подлинности «Магического осьминога» в виде желе. Левый столбец вывода - это удаленный символ, а правый столбец - вывод полученной программы.


Моя действительность проверки не thaaat фантазии. Это терпит неудачу для другого отправленного решения;).
Волшебная Урна Осьминога
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.