Натхненний цим коментарем ...
Дякую користувачам Step Step Hen , Wheat-Wizard та Dennis за те, що вони допомогли мені затвердити специфікацію цього завдання перед тим, як опублікувати його!
Це нитка копів. Для нитки розбійників перейдіть сюди
У цьому завданні вам поставлено завдання виконати деякий код, який робить його таким чином, щоб ваша мова більше не відповідала нашим критеріям мови програмування. У цьому виклику це означає зробити так, щоб мова більше не могла ...
Візьміть числовий вхід і вихід
Додайте два числа разом
Перевірте, чи певне число є простим чи ні.
Це виклик для поліцейських і грабіжників , де є два різні завдання з двома різними цілями: поліцейські намагатимуться написати якийсь код, який робить мову переважно непридатною, а грабіжники намагатимуться знайти прихований спосіб вирішення, який дозволяє поліцейським відновити свою мову.
Як поліцейський, ви повинні написати два фрагменти коду:
Такий, який робить вашу мову в основному непридатним, наприклад, видаляючи вбудовані функції для введення / виводу та чисельних операцій. Чим більше функцій ви видалите, тим краще. Цей код НЕ дозволив врізатися або вийти. Потрібно додати код до кінця цього фрагмента, і цей код буде оцінено . І ...
... фрагмент коду, який приймає в якості двох невід’ємних цілих чисел, додає їх разом і виводить їх суму. Цей фрагмент повинен правильно функціонувати навіть після запуску першого фрагмента. Коли два фрагменти об'єднані разом, вони повинні сформувати повну програму, яка додає два числа, або визначити функцію, яка додає два числа. В ідеалі цей фрагмент повинен покладатися на дуже незрозумілу поведінку, щоб його було складніше знайти.
Ви можете обрати будь-який стандартний метод введення та виводу . Однак ви повинні точно розкрити, який формат (вхід і вихід) ви використовуєте. Грабіжник не може зламати вашу відповідь, якщо вони не використовують той самий формат, що і ви.
Написавши обидва ці фрагменти, ви повинні опублікувати перший як відповідь, не розкриваючи другий. Ваша відповідь повинна містити всю наступну інформацію:
Перший фрагмент (явно не другий).
Мова (включаючи незначну версію, оскільки більшість публікацій, ймовірно, покладаються на чужі кращі регістри)
Формат IO, включаючи, чи це функція, або повна програма. Грабіжники повинні використовувати той самий формат, щоб їх тріщина була дійсною.
Будь-які дивні випадкові випадки, необхідні для вашої відповіді. Наприклад, працює лише під Linux або вимагає підключення до Інтернету . Очевидно, це трохи суб'єктивно, але якщо у поліцейського є якийсь крайній край, який запобігає його розлому, а потім виявляє це лише після безпечності, я вважаю це поганим спортивним майстерністю. Потенційний грабіжник повинен мати всю інформацію, необхідну для того, щоб зламати вашу відповідь, перш ніж її зламати .
Вам не потрібно розкривати кількість байтів, поки відповідь не буде надійною.
Ось приклад. Для першого фрагменту ви можете надіслати наступну програму Python 3:
Пітон 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()
недійсний, оскільки він не порушує мову. Він просто відходить. Так само введення нескінченного циклу недійсне, оскільки другий фрагмент ніколи не буде виконаний.
Після надійності ваш рахунок - це кількість байтів обох фрагментів .
Це повернеться до Будь ласка, розкрийте будь-які дивні випадкові випадки, необхідні для вашої відповіді на роботу ... Ваші подання повинні містити достатню кількість інформації, перш ніж виявити, щоб можна було відтворити після розкриття. Це означає, що якщо ваша відповідь стає безпечною, а потім ви редагуєте: Ось моя відповідь. О так, BTW, це працює лише в тому випадку, якщо ви запускаєте його на Solaris, жарт на вас! Ваша відповідь недійсна і буде видалена і не вважатиметься придатною для виграшу.
Другий фрагмент дозволений до збоїв після виведення суми - доки результат все ще правильний (наприклад, якщо ви вирішите вивести на STDERR, а потім отримаєте купу інформації про збій, це недійсно).
Ви не можете редагувати свій код після надсилання відповіді.
Ви не можете покладатися на криптографічні функції, такі як шифрування, хеш-функції, CSPRNG тощо.
int main(){ do_evil_stuff(); }
куди повинен піти код користувачів? У функції? Після всіх тверджень вmain
?