Соревнование
Я представляю вам еще один вызов шпион против шпиона, противопоставляя обфускаторы против крекеров. В этом случае, однако, защищаемая база данных является не входом, а выходом .
Правила вызова просты. Напишите процедуру со следующими характеристиками:
- Процедура может быть написана на любом языке, но не может превышать 320 байт.
- Процедура должна принимать три 32-битных целых числа со знаком в качестве входных данных. Он может принимать форму функции, которая принимает 3 аргумента, функции, которая принимает один массив из 3 элементов, или полной программы, которая читает 3 целых числа из любого стандартного ввода.
- Подпрограмма должна вывести одно 32-разрядное целое число со знаком.
- Для всех возможных входов подпрограмма должна выводить от 2 до 1000 (включительно) уникальных значений. Число уникальных значений, которые может выдать подпрограмма, называется ее ключом .
Как пример, программа на C
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
имеет ключ 9, так как он (надеюсь) может выводить только девять значений 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, и 24
.
Некоторые дополнительные ограничения заключаются в следующем:
- Процедура должна быть полностью детерминированной и не зависящей от времени, возвращая идентичные выходные данные для идентичных входных данных. Подпрограмма не должна вызывать генераторы псевдослучайных чисел.
- Процедура может не полагаться на «скрытые переменные», такие как данные в файлах, системные переменные или функции эзотерического языка. Например, процедуры обычно не должны ссылаться на константы, если только константы не определены четко в самом коде. Подпрограммы, которые основаны на причудах компилятора, выходах из математически неопределенных операций, арифметических ошибках и т. Д., Также настоятельно не рекомендуется. Если есть сомнения, пожалуйста, спросите.
- Вы (кодер) должны точно знать, сколько уникальных выходов может произвести подпрограмма, и должны быть в состоянии предоставить хотя бы одну входную последовательность, которая производит каждый выход. (Поскольку потенциально могут быть сотни уникальных выходных данных, этот набор будет запрашиваться только в том случае, если ваш ключ оспорен.)
Поскольку эта проблема намного меньше похожа на классическое шифрование, чем предыдущая, я ожидаю, что она будет доступна для более широкой аудитории.
Чем креативнее, тем лучше.
Скоринг
Самые короткие не взломанные данные на счетчик байтов будут объявлены победителями.
Если есть путаница, пожалуйста, не стесняйтесь спрашивать или комментировать.
Встречный вызов
Всем читателям, включая тех, кто представил свои собственные процедуры, предлагается «взломать» материалы. Отправка взламывается, когда ее ключ публикуется в соответствующем разделе комментариев. Если представление сохраняется в течение 72 часов без изменения или взлома, оно считается «безопасным» и любой последующий успех в взломе будет проигнорирован ради контеста.
Допускается только одна попытка взлома на каждое представление на читателя. Например, если я отправляю пользователю X: «ваш ключ - 20», и я ошибаюсь, пользователь X откажется от моей догадки как от неправильной, и я больше не смогу отправлять дополнительные предположения для этой отправки.
Взломанные материалы исключаются из спора (при условии, что они не «безопасны»). Они не должны редактироваться. Если читатель хочет представить новую рутину, он должен сделать это в отдельном ответе.
Оценка взломщика - это количество представлений (соответствующих или нет), которые он взламывает. Для взломщиков с одинаковыми подсчетами ранжирование определяется по общему количеству байтов во всех взломанных отправках (чем выше, тем лучше).
Взломщик (-и) с наибольшим количеством баллов будут объявлены победителями вместе с разработчиками процедур-победителей.
Пожалуйста, не взламывайте ваши собственные представления.
Удачи. :)
Leaderboard
Последнее обновление 2 сентября, 10:45 EST
Неподвижные барьеры (не взломанные материалы):
- CJam, 105 [Денис]
Непреодолимые силы (взломщики):
- Деннис [ Ява, 269 ; С 58 ; Mathematica, 29 ]
- Мартин Бюттнер [ Ява, 245 ]
return
и т.д ...Ответы:
CJam, 105 байт
Выше используются символы каретки и M, поскольку они содержат непечатаемый символ. После преобразования потока байтов в целое число (
256b
) выполняется следующий код:Вы можете попробовать эту версию онлайн в интерпретаторе CJam .
Как это устроено
Это представление использует теорию чисел вместо запутывания. Программа вернет 0 почти для всех входов. Из нескольких входных данных, которые приводят к ненулевому выходному сигналу, получается секретный модуль, который применяется к 10 младшим значащим битам третьего целого числа.
Наиболее эффективным способом решения этой задачи (о котором я могу думать) было бы разложение 512-битного целого числа, которое, я надеюсь, не будет достигнуто через 72 часа.
Пример запуска
источник
Ява - 269
Спасибо всем за терпение, теперь это нужно исправить.
укорочен:
Не сокращено:
источник
double e,f,d=...;e=...;f=...;
наdouble d=...,e=...,f=...;
1
и ваш ответ также является неправильным;) (123 правильные ... кто-то пришел и взял потрясающий счет ...). И я думаю, что Stretch Maniac не учел,sin == 1.0
когда он сказал, что 122 - это правильно.Пробоотборник
Конечно, это не официальная запись, и количество персонажей слишком велико, но я полагаю, что если кому-то захочется сойти с ума, он может попытаться определить, сколько уникальных выходов производит следующая функция (с учетом трех входов, как описано в ОП). :
На самом деле, я настолько уверен, что его невозможно сломать, я награду каждого, кто взломает его, «Высшую награду за непреодолимую силу природы».
Потому что на самом деле они этого заслуживают.
источник
C, 58 байт (треснувший)
Простой:
источник
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Ява - 245
Взломанный Мартином Бюттнером
Подайте входные данные как массив int:
a(new int[]{1,2,3})
. Я не ожидаю, что это пройдет 72 часа, но получайте от этого удовольствие.Вот это с переносами строк, чтобы сделать его немного более читабельным:
источник
Mathematica, 29 байт, ключ: 715, взломан Деннисом
Это просто исправленная версия моего первоначального ответа, которая не работала для неположительных входных данных.
Принимает список целых чисел, таких как
источник
349
уникальные выводы. Диапазон был от3
до717
.3 ... 717
).207 символов, в C / C ++, еще не запутано:
источник