Виклик
Ваше завдання - кодувати ціле число у вигляді рядка символів ASCII , а потім успішно розшифрувати його після випадкового переміщення зазначеної рядки.
Ви напишете дві програми / функції , які будуть іменуватися Encoder і Decoder .
Енкодер
- Введення: ціле число у діапазоні .
- Висновок: рядок з ASCII символів (не обов'язково для друку).
Дешифратор
- Введення: випадкова перестановка рядка .
- Вихід: ціле число .
Оцінка балів
Нехай бути максимальною довжиною по у всіх можливих значеннях . Якщо Енкодер діє недетерміновано (що дозволено, див. Нижче), то буде максимальною довжиною яка може виникнути (можливо, ).
Нехай буде довжиною кодувальника в байтах і довжиною декодера в байтах.
Тоді ваш рахунок - .
Перемога присуджується за подання найнижчим балом .
Термін
Існує дещо довільне обмеження часу в 1 хвилину на час виконання і Енкодера, і Декодера для однієї проби (тобто одного значення ).
Мета полягає в тому, щоб уникнути рішення, яке знайде цю грубу силу кодування шляхом перерахування всіх послідовностей з певними властивостями. Якщо ваше рішення зробить щось більш розумне, ніж це, воно, швидше за все, відповідатиме часовим обмеженням і вважатиметься дійсним. Так само, якщо він працює на TIO для деяких випадково вибраних значень він вважатиметься дійсним. Інакше я перевіряю його на своїй машині, але зауважте, що якщо ваше рішення є чистою грубою силою, воно майже напевно вийде з ладу.
Правила
- Кодер і декодер повинні бути написані на одній мові .
- Декодер необхідно виводити правильно ціле число для кожного з можливих перестановок з рядка , повернутого кодировщик .
- Кодер і декодер є НЕ дозволяється обмінюватися інформацією будь-яким способом (наприклад , за допомогою глобальних змінних або файлів).
- Вихід кодувальника повинен НЕ бути детермінованим (тобто, той же вхід може виробляти різні рядки виведення , якщо кодировщик виконується кілька разів), але Decoder завжди повинні вгадати правильне число .n
- Кодер і декодер можуть приймати і повертати ціле число в будь-якому зручному способі (наприклад , якщо це нормально для введення , щоб бути , або ).n = 14
14
"14"
[1,4]
- Кодер може виводити рядок або шляхом друку його на або шляхом повернення рядка, список / масив символів або список / масив цілих чисел в діапазоні ; зауважте, що Декодер отримає як вхід перестановку , повернуту Енкодером , тому він повинен прийняти рядок у тому ж форматі, що і .[ 0 , 127 ] s s ′ s
stdout
- Стандартні лазівки заборонені.
- По можливості поясніть, як працює ваш код і чому оцінка, яку ви заявляєте, є правильною.
Приклад
Припустимо, .
- Кодер приймає в
14
якості вхідних даних. Це може вивести"qwerty"
.- Декодер приймає перестановку в
"qwerty"
якості вхідних даних, наприклад"tweyqr"
. Він повинен виводити14
(у будь-якому зручному форматі).
Кодувальник міг би повернутися , [113,119,101,114,116,121]
а також, в цьому випадку декодер отримав би (наприклад) [116,119,101,121,113,114]
.
Зауважте, що рядок, повернений Енкодером, може також містити символи ASCII, що не можна друкувати (але завжди в діапазоні [0x00, ..., 0x7F]
).