Радиационно-стойкая программа - это программа, в которой, если какой-либо символ кода будет удален, программа все равно будет работать так же. На этот вопрос мы напишем программу, которая определяет, когда она облучается.
Напишите программу или функцию, которая, когда удаляется какой-либо один байт, результирующая программа будет выводить этот байт и только этот байт. ( Вы можете выводить этот байт несколько раз, если вы не выводите другой байт )
Правила:
- Программа должна содержать как минимум 2 разных байта. (Нет решений только 0s;)
- Неважно, что делает оригинальная программа
- Нет чтения вашего собственного исходного кода.
- Код будет оцениваться по количеству отдельных байтов, в которых побеждает наибольшее количество. Например,
abc
= 3 балла,ababba
= 2 балла,abc
выигрывает.- Tie-breaker - это меньшее число байтов, за которым следует более раннее время отправки
Удачи!
code-challenge
radiation-hardening
Джо Кинг
источник
источник
Ответы:
05AB1E ,
97 байт (оценка 3)Попробуйте онлайн!
Удаление
'
Если
'
удалить все,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 ...
Более правильные решения, которые хуже или те же
'
выше 2 будет работать ...'''''''VV
,'''''''XX
или'''''''<any command that pops a without pushing>x2
'
выше 3, за которым следует любое четное числоs
выше 1 (EG'''''''''ssss
).'''..
с любым числом периодов выше 1 и любым нечетным числом'
выше 2.'\\'''rr
- та же идея,22'''rr
но\
является "удалить последний элемент стека.источник
'
имеет значения по правилам, как вы говорите. Но это лишает законной силы номинальную цель обнаружения аномалий, что немного забавно.Brainfuck, оценка 3
Может быть неконкурентным, так как вывод виден только через дамп памяти.
Предполагая, что ввод пуст и EOF оставляет ячейку без изменений. Использует интерпретатор, который выводит память на вывод, такой как этот .
Удалите плюс, и память является значением Unicode для «+», иначе это значение Unicode для «,». Хотя это скорее правило, а не ответ. Примерно то же самое с "-". Нарушает тот факт, что эти три символа следуют друг за другом в наборе символов Юникод.
источник
Груша, 256 различных байтов, 975 байтов
К сожалению, вопрос в значительной степени требует оптимального решения, чтобы где-то содержать байт NUL (поскольку он должен где-то содержать все 256 байтов). Это означает, что: а) я не могу дать вам ссылку на TIO (потому что TIO не нравится NUL в программах, или, по крайней мере, я не нашел способ набрать его, с которым может справиться мой браузер), и б) я не может вставить программу в Stack Exchange буквально. Вместо этого я поместил
xxd
обратимую hexdump, скрытую за ссылкой «фрагмент кода» ниже.Показать фрагмент кода
объяснение
Эта программа состоит из трех одинаковых частей. (Конкатенация нескольких идентичных частей программы является для меня темой в программах радиационной стойкости .) Каждому Грушевому дереву требуется контрольная сумма где-нибудь, чтобы дать интерпретатору понять, какие части программы нужно запустить; он вращает любую часть программы, для которой контрольная сумма успешно запускается перед запуском (или печатает,
a partridge
если контрольная сумма не совпадает). В этом случае у нас есть контрольная сумма на каждой из трех частей, и, таким образом, необлученная часть переместится в начало. Таким образом, мы можем предположить, что программа состоит из неизмененной части, за которой следуют две другие части (одна из которых, возможно, была изменена).Каждая часть начинается с новой строки, затем продолжается следующим кодом (я добавил пробел и комментарии ниже):
После этого следует копия каждого октета, который до сих пор не использовался в программе (чисто для подсчета очков), и, наконец, контрольная сумма. (Там нет завершающего символа новой строки; части начинаются с новой строки, но не заканчиваются ею.)
Здесь есть три разных случая:
%z
нечетное количество раз, в конечном итоге попав в хеш-таблицу. Фактически, это будет единственный ключ в хеш-таблице (поскольку строка запускается от новой строки второй части до конца третьей части, а хеш-таблица начинается только с одной новой строки), поэтому она ' Я просто распечатаю сам.<DATA>
содержит каждый символ четное число раз, поэтому хеш-таблица будет иметь исходное содержимое, одну новую строку, и она будет напечатана.<DATA>
только начинает читать с строки ниже__DATA__
, поэтому он увидит только третью часть. В нем более пяти символов, которые появляются нечетное количество раз, поэтому будет запускаться специальный случай для печати новой строки.верификация
И последнее, что нужно проверить практически для любой программы Pear Tree, защищенной от радиации, - это случайное удаление случайным образом правильной контрольной суммы нежелательного участка кода и его поворота в неправильном месте; учитывая, что мы используем 32-битные контрольные суммы, это маловероятно, но не невозможно. Я использовал следующий скрипт brute-force, чтобы гарантировать, что это не произойдет при удалении:
Скрипт проверки подтверждает, что эта программа работает правильно.
источник
Stax , 11 байт (оценка 4)
Запускать и отлаживать онлайн!
Для меня большая честь получить первый (в хронологическом порядке) ответ на этот вызов со счетом выше или равным 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
, два элемента выталкиваются из основного стека, и теперь вершина стека является'
и выводится.Следовательно, мы можем обнаружить излучение в третьей части. По той же причине мы можем обнаружить излучение во второй части.
источник
05AB1E , оценка 2, 6 байтов
Отпечатки удваивают удаленный символ иногда. Не содержит
'
.Как это работает:
Удаление первого
„
Попробуйте онлайн!
Сначала мы помещаем пустой стек в строку. Затем мы нажимаем
„„
, что печатается неявно.Удаление
"
Попробуйте онлайн!
Сначала мы добавляем
""
в стек2-char string
инструкции. Затем мы пытаемся получить еще одну 2-символьную строку, но это прервано (я не совсем уверен, почему) и""
печатается.Удаление второго или третьего
„
Попробуйте онлайн!
Сначала мы добавляем
""
в стек2-char string
инструкции. Затем мы нажимаем„
, что печатается неявно.источник
Желе , 5 байт, оценка 2
Попробуйте онлайн!
При любом
”
удалении:Попробуйте онлайн!
Символ
”
начинает однобайтовый буквенный символ. Эта программа начинается с того,””
что дает строку”
.ḷ
Двойка берет это левый аргумент. Строка”
просто передается через два экземпляраḷ
.При любом
ḷ
удалении:Попробуйте онлайн!
В этой программе
””
выдает символ,”
затем”ḷ
выдает символ,ḷ
и только это выводится.Другие решения
a
илиo
работали бы вместоḷ
этого представления.⁾⁾⁾⁾FFF
, Это работает аналогичным образом.⁾
это как ,”
но он запускает два байтовые строковый литерал. «Облученные» программы дважды выводят удаленный байт, который в комментариях был признан действительным.Вот (гораздо менее навороченная) версия проверки подлинности «Магического осьминога» в виде желе. Левый столбец вывода - это удаленный символ, а правый столбец - вывод полученной программы.
источник