Змагання
Представляю вашій увазі ще одного шпигуна проти шпигунського виклику, що підкорює обскускаторів проти сухарів. Однак у цьому випадку дана, що захищається, є не входом, а результатом .
Правила виклику прості. Напишіть розпорядок із наступними характеристиками:
- Програма може бути написана будь-якою мовою, але не може перевищувати 320 байт.
- Підпрограма повинна приймати три 32-бітні цілі числа як вхідні дані. Він може мати форму функції, яка приймає 3 аргументи, функцію, яка приймає єдиний 3-елементний масив, або повну програму, яка зчитує 3 цілих числа з будь-якого стандартного вводу.
- Підпрограма повинна виводити одне підписане 32-бітове ціле число.
- На всіх можливих введеннях рутина повинна виводити між 2 і 1000 (включно) унікальних значень. Кількість унікальних значень, які може вивести рутина, називається її ключем .
Як приклад - програма С
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 відкине мою здогадку як неправильну, і я більше не зможу надсилати додаткові здогадки для цього подання.
Зламані подання виключаються із суперечок (за умови, що вони не є "безпечними"). Їх не слід редагувати. Якщо читач бажає подати нове розпорядження, він повинен зробити це окремою відповіддю.
Оцінка зловмисника - це кількість подань (сумісних або невідповідних), які він зламає. Для сухарів з однаковими підрахунками рейтинг визначається підсумковим числом байтів у всіх тріщинах (чим вище, тим краще).
Крекер (и) з найвищим балом (и) буде оголошено переможцями разом з розробниками переможних процедур.
Будь ласка, не зламайте власне подання.
Удачі. :)
Таблиця лідерів
Останнє оновлення 2 вересня, 10:45, EST
Нерухомі бар'єри (неполамані матеріали):
- CJam, 105 [Денніс]
Сили, що не зупиняються (крекери):
- Денніс [ Ява, 269 ; C, 58 ; Математика, 29 ]
- Мартін Бюттнер [ Java, 245 ]
return
і т.