Вдохновленный этим комментарием ...
Спасибо пользователям Step Hen , Wheat-Wizard и Dennis за помощь в разработке спецификации этого задания перед его публикацией!
Это нить ментов. Для нити грабителей, иди сюда
В этом задании перед вами стоит запуск некоторого кода, который делает его таким, чтобы ваш язык больше не удовлетворял нашим критериям языка программирования. В этом вызове это означает сделать так, чтобы язык больше не мог ...
Возьмите числовой ввод и вывод
Добавьте два числа вместе
Проверьте, является ли определенное число простым или нет.
Это задача полицейских и грабителей , где есть две разные задачи с двумя разными целями: копы попытаются написать некоторый код, который делает язык в основном непригодным для использования, и грабители попытаются найти скрытый обходной путь, который позволяет копам восстановить свой язык.
Как полицейский, вы должны написать два фрагмента кода:
Тот, который делает ваш язык в основном непригодным, например, удаляя встроенные функции для ввода / вывода и числовые операции. Чем больше функций вы удалите, тем лучше. Этот код не может произойти сбой или выход. Должна быть возможность добавить код в конец этого фрагмента, и этот код будет оценен . А также...
... фрагмент кода, который принимает два неотрицательных целых числа в качестве входных данных, складывает их вместе и выводит их сумму. Этот фрагмент должен работать правильно даже после запуска первого фрагмента. Когда два фрагмента объединены вместе, они должны сформировать полную программу, которая добавляет два числа, или определить функцию, которая добавляет два числа. В идеале этот фрагмент должен опираться на очень неясное поведение, чтобы его было труднее найти.
Вы можете выбрать любой стандартный метод ввода и вывода . Однако вы должны точно указать, какой формат (входной и выходной) вы используете. Грабитель не может взломать ваш ответ, если он не использует тот же формат, что и вы.
После написания обоих этих фрагментов вы должны опубликовать первый ответ, не раскрывая второй. Ваш ответ должен содержать всю следующую информацию:
Первый фрагмент (явно не второй).
Язык (включая минорную версию, так как большинство представлений, вероятно, будет опираться на странные крайние случаи)
Формат ввода-вывода, в том числе ли это функция или полная программа. Грабители должны использовать тот же формат, чтобы их трещина была действительной.
Любые странные крайние случаи, необходимые для вашего ответа на работу. Например, работает только на Linux или требует подключения к Интернету . Очевидно, это немного субъективно, но если у полицейского есть какой-то крайний крайний случай, который предотвращает его взлом, а затем обнаруживает это только в безопасности, я считаю это плохим спортивным мастерством. У потенциального грабителя должна быть вся информация, необходимая для взлома вашего ответа, прежде чем он будет взломан.
Вам не нужно раскрывать количество байтов, пока ваш ответ не будет безопасным.
Вот пример. Для первого фрагмента вы можете отправить следующую программу на Python 3:
Python 3
print=None
Принимает ввод из STDIN и вывод в STDOUT
И тогда, как ваш второй фрагмент, вы можете написать:
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Это верно, потому что он будет принимать два числа в качестве входных данных и выводить их сумму, даже если вы соедините два фрагмента вместе, например
print=None
import sys
a,b=int(input()),int(input())
sys.stdout.write(a+b)
Однако для грабителя будет очень легко найти решение. Поскольку это было бы очень легко взломать, вы можете попытаться исправить этот конкретный подход следующим образом:
import sys
sys.stdout=None
print=None
Однако даже у этого есть очень легкий обходной путь:
del print
a,b=int(input()),int(input())
print(a+b)
Как полицейский, ваша цель - сделать скрытый обходной путь как можно более скрытным, чтобы не дать грабителям найти его.
В разбойниках будут смотреть на один из ваших ответов, и попытаться взломать его. Они могут взломать его, написав любой допустимый фрагмент кода, который может работать как фрагмент 2 (сложение двух чисел после того, как язык становится в основном непригодным для использования). Это не обязательно должен быть тот же фрагмент, который вы изначально предполагали. Если грабитель взломает ваш ответ, он оставит комментарий к вашему ответу, а затем вы должны отредактировать его, чтобы указать, что он был взломан. Если ваш пост взломан, вы должны отредактировать свой ответ, чтобы показать решение (фрагмент 2), которое вы изначально планировали. Это не правило как таковое , просто дружеское предложение, чтобы игра оставалась веселой. Ты не должен.
Если ответ остается без изменений в течение одной недели, вы можете отредактировать свой второй фрагмент и указать, что ваш ответ теперь безопасен . Если вы не редактируете его по истечении недели, другие пользователи все равно могут его взломать, пока вы не сделаете это. Если вы не раскрываете свой второй фрагмент, вы не можете требовать баллы за ваш ответ или называть его безопасным.
Победителем в потоке полицейских является самый короткий безопасный ответ, включающий оба фрагмента , подсчитанные в байтах, и этот ответ будет принят после того, как пройдет достаточно времени. Вам не нужно раскрывать количество байтов до тех пор, пока ваш ответ не будет безопасным, поскольку количество байтов не имеет отношения к вашему счету, пока ваш ответ не будет безопасным. В случае, если прошло достаточно времени, а ответы не остались без изменений, победителем будет тот ответ, который оставался без изменений в течение самого длительного периода времени.
Веселиться!
Разъяснения правил
Первый фрагмент должен работать правильно, без каких-либо входных данных . Он может выводить все, что угодно, и этот вывод будет игнорироваться - до тех пор, пока после создания фрагмента второй фрагмент работает правильно.
Второй фрагмент должен быть действительно выполнен, чтобы ваш ответ был действительным. Это означает, что ответ как
import sys sys.exit()
недопустимо, потому что это не нарушает язык. Это просто выходит. Точно так же ввод бесконечного цикла недопустим, так как второй фрагмент никогда не будет выполнен.
После того, как вы в безопасности, ваш счет - это количество байтов обоих фрагментов .
Это восходит к Пожалуйста , выявить какие - либо странные случаи краев , необходимые для ответа на работу ... Ваша заявка должна содержать достаточно информации , прежде чем раскрываются воспроизводимыми после раскрываются. Это означает, что если ваш ответ станет безопасным, а затем вы отредактируете в: Вот мой ответ. Да, кстати, это работает, только если вы запускаете его на Solaris, шутка над вами! Ваш ответ недействителен и будет удален и не будет признан приемлемым для победы.
Второй фрагмент кода может потерпеть крах после вывода суммы - до тех пор, пока вывод остается верным (например, если вы выберете вывод в STDERR, а затем получите кучу информации о сбое, это недопустимо).
Вы не можете редактировать свой код после отправки ответа.
Вы не можете полагаться на криптографические функции, такие как шифрование, хэш-функции, CSPRNG и т. Д.
int main(){ do_evil_stuff(); }
куда должен идти код пользователя? В функции? После всех заявлений вmain
?