Задача полицейских состоит в том, чтобы написать функцию или программу, которая, когда ей дают ввод, выводит конечную детерминированную строку. Если программе дан другой ввод, она должна вернуть другой вывод.
Правила:
- Материалы состоят из
- Название языка
- Если используются какие-либо флаги, они должны быть раскрыты.
- Количество байтов программы
- Количество байтов вывода
- Вывод
- Если это особенно долго, пожалуйста, предоставьте пастин или что-то подобное
- Если он содержит непечатные документы, предоставьте hexdump.
- Конечные символы новой строки и пробелы должны быть включены в вывод
- Откуда поступает ввод (STDIN, командная строка и т. Д. )
- Название языка
- Если применимо, вы можете предположить, что байт, представляющий EOF, отсутствует во входных данных, если вы не используете этот байт в своей программе.
- Если ваша программа взломана, добавьте ссылку на соответствующий ответ в ветке грабителя в вашем заголовке.
- Ваша программа небезопасна до тех пор, пока не пройдет неделя, и вы отмечаете это так.
- Я не одобряю методы, такие как случайное заполнение с помощью входных или криптографических хеш-функций. Я не могу их остановить, но я не приму решение, которое использует любой из них . Также обратите внимание, что некоторые из этих методов могут иметь коллизии, когда другая строка дает одинаковый результат.
- Ваша цель - получить максимально короткий результат. Самое короткое безопасное решение, опубликованное в течение трех недель после публикации этого вопроса, выигрывает!
Задача грабителя состоит в том, чтобы найти программу размером, равным или меньшим, чем оригинал, который также подчиняется вышеуказанным правилам.
Если грабитель взломает вашу программу с помощью решения, отличного от предполагаемого, то у вас есть возможность «взломать» его, доказав, что решение грабителя неверно. Вы можете сделать это, найдя вход в программу грабителя, который будет производить тот же результат.
Пример представления:
brainfuck, 10 байт, оценка: 10
]<.[<],>[,
Это решение , [>,] <[. <], Которое просто меняет ввод
Удачи!
code-challenge
cops-and-robbers
Джо Кинг
источник
источник
1
для себя и для0
других1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941
для некоторых других строк.Ответы:
7 , 31 персонаж, 30 баллов, безопасно, но возможно сломано?
Программа 7 обычно представляет собой просто число, но она может содержать пробелы, разбивая ее на несколько чисел. Следовательно, это представление состоит из двух чисел (которые неявно объединяются интерпретатором 7), и программа также принимает два числа в качестве ввода через стандартный ввод. («31 символ» в заголовке - это общая длина двух чисел плюс один разделяющий символ пробела; цифры, составляющие числа, интерпретируются как восьмеричные при использовании в качестве программы, но десятичные при использовании в качестве входных данных, и это цифры, которые одинаковы в обоих случаях, а не фактические числа. Обратите внимание, что это не имеет значения, когда рассматривается как программа или как ввод, разделяете ли вы их пробелом или символом новой строки; я надеюсь, что это не так. не признать недействительным.)
Ожидаемый результат - следующее число (выражается здесь в десятичном виде, поскольку это формат вывода, который использует интерпретатор 7):
Обратите внимание, что интерпретатор 7, связанный с вики Esolang, внутренне хранит числа в унарном виде, что означает, что у вас вряд ли будет достаточно памяти, чтобы фактически запустить программу на себя, чтобы посмотреть, что она делает. Я проверил программу, отработав ее поведение вручную и протестировав ее на небольших входах, чтобы убедиться, что она сделала то, что ожидала. Альтернативный подход заключается в написании интерпретатора, который использует более эффективный метод хранения чисел.
Избегать трещин здесь было чем-то вроде боли, но я наконец-то убедился, что никакие два числа, кроме тех, что указаны в самой программе, не могут выдавать 238363505302130098723162537059 в качестве вывода. ( Отредактируйте 1 неделю спустя: возможно, я ошибался, в зависимости от того, как вы интерпретируете вопрос; см. Ниже. )
Решение
Оригинальная программа была:
Предполагалось, что никакой другой ввод не даст желаемого результата, потому что:
Однако, в зависимости от того, как вы интерпретируете вопрос, может быть второй вход, который производит желаемый результат (таким образом, лишает законной силы это решение):
объяснение
Вот как функционирует предполагаемое решение:
источник
Node.js v10.9.0 , 40 байт, оценка: 40, трещины
вход
Это функция, принимающая ровно один параметр.
Вывод
источник
o=>[...j=o,].sort(n=>(j+=113)&69).join``
, ноj
не могу перейти к целому числуГруша , 46 байтов ASCII, оценка 0, треснувший
Ввод взят из стандартного ввода. Ожидаемый вывод (при стандартном выводе) представляет собой пустую строку (т. Е. Когда программа задается в качестве аргумента, вывод не должен выводиться).
Другими словами, задача здесь состоит в том, чтобы написать программу Pear Tree, которая ничего не выводит на стандартный вывод, когда она дает себя на стандартный ввод, и которая выводит что-то на стандартный вывод, когда на стандартный ввод что-то другое, чем она сама, используя no более 46 байт. (Мне удалось сделать это, когда я держал программу в печатном ASCII, несмотря на то, что A Pear Tree часто использовал не ASCII и непечатные символы.) Это фактически задача написания самоидентифицирующейся программы с определенным форматом вывода. (т. е. пустая строка при успешной самоидентификации); однако, у Грушевого дерева есть по крайней мере два поворота, которые делают задачу несколько более сложной, чем это выглядит на конкретном языке (именно поэтому я выбрал его для представления в полицию).
Мое решение
Мое решение немного отличается от трещины:
Попробуйте онлайн!
Вместо использования
exit
я вместо этого устанавливаю$_
(неявный вывод) и$\
(перевод строки после вывода, включая неявный вывод) в нулевую строку, если есть совпадение (и1
если нет совпадения). Aprint
по-прежнему требуется, потому что неявный вывод включается только в том случае, если имеется хотя бы один байт ввода (таким образом, нам нужно явно печатать что-то, если в качестве входных данных нам дается пустая строка, отличная от программы).Каждая программа A Pear Tree должна где-то содержать контрольную сумму (именно
MZpa
в этом решении). И моё решение, и взломанные имена переменных (и другие мелкие детали кода), чтобы контрольная сумма состояла полностью из букв ASCII.источник
Perl 5
-p0777
, 10 байт, оценка 10, безопаснаяПоследний символ здесь - «сдвиг», код символа 14 (десятичный) / 0E (шестнадцатеричный). Все остальные для печати ASCII.
Поскольку мы используем неявный аргумент ввода / вывода Perl
-p0777
, ввод поступает со стандартного ввода, а вывод - со стандартным выводом.Решение
Программа делает следующее:
Это означает, что сама программа, единственный вход, производящий желаемый результат, является:
Попробуйте онлайн!
объяснение
источник
Python 3, взломан 50 байт
Ввод и вывод из / в stdin / -out. Выход различен для каждого отдельного входа. Уникальный вывод при наличии исходного кода:
(Это 150 цифр)
Удачи!
источник
05AB1E , 35 байт, оценка: 7
Вход:
от
stdin
Вывод:
QÕ Ƿe
источник
Cubix , 18 байт, оценка 18, сейф
Обидно, что эта проблема не привлекла больше внимания, но иногда так и происходит. Я собирался оставить это небезопасным, но решил опубликовать решение, прежде чем я забыл об этом.
Это должно быть довольно легко взломать.
Вход от
stdin
Вывод
Изменить: я должен отметить, что это ожидает источник в его сокращенной форме ... и теперь я заметил, что есть пропущенный байт (непечатный) из результата, который я сломал, когда я отправил. Нужно скопировать сейчас. Шестнадцатеричные значения
24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39
Концепция заключалась в том, чтобы удалить печать первого символа, а затем удалить обратный индекс из символа, например [chars] - [0, len ([chars]) .. 2]
Код
который отображается на следующий куб
Попробуй здесь
источник
Желе , 14 байт, Оценка: 21, Сейф
И программа, и размер вывода подсчитываются с использованием кодовой страницы Jelly.
вход
Первый аргумент командной строки.
Вывод
Решение
Попробуйте онлайн!
источник
v⁼
, выдаст,1
если вход, оцененный как код Jelly с входом ввода, равен входу и будет либо давать, либо выдавать0
ошибку (если вход является недопустимым кодом Jelly), если нет.JavaScript Firefox, <10 байт, Оценка: 52, из ввода аргументов функции, Cracked
btoa(btoa)
кодирует следующую строку:который дает:
только что скопировал
источник
GCC 61-> 61 байт
Полная программа, принимает вход от stdin и выводит на stdout
источник
50
?Perl 6, 43 байта, оценка: 15, из стандартного ввода
источник
Пепе , 23 байта, оценка: 23, взломан MickyT
Входные данные:
стандарт
Вывод:
источник
J , 26 байт, оценка: 52, сейф
Программа не REPL, а полный скрипт, который принимает
stdin
и явно печатаетstdout
.вход
Стандартный ввод.
Вывод
Нет, это не метод шифрования.
Решение
Попробуйте онлайн!
источник
Кег , 6 байт, Оценка: 6
вход
С
stdin
помощью?
Вывод
Имейте в виду, что это escape-последовательности для непечатаемых байтов. Замените побеги буквальными символами. Необработанный текст доступен здесь
Удачи с этим! Увидимся на следующей неделе!
источник
Perl 6, 31 байт, Оценка: 39, из stdin - Cracked
Трещины здесь
Грубое решение. Мог бы выжить.
источник