Вот буквы английского алфавита по порядку по частоте:
e t a o i n s h r d l c u m w f g y p b v k j x q z
Это e
наиболее часто используемая буква и z
наименее распространенная. (Данные из Википедии .)
Ваша задача - взять текст ROT-n'd, например:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Это текст «это очень секретное сообщение, которое очень надежный и безопасный», который «зашифрован» через ROT-21 (половина из 42). Ваша программа, используя приведенную выше таблицу частот, должна быть в состоянии определить, насколько повернут каждый символ и исходный текст.
(Если вы не знакомы с ROT-n, он по существу сдвигает каждый символ на n
. Например, в ROT-2,. a -> c, b -> d, ..., x -> z, y -> a, z -> b
)
Как, спросите вы? (Очень наивный) алгоритм, который вы должны использовать:
- для каждого
n
от0
до25
включительно применять ROT--n
к входной строке. (Отрицательно,n
потому что мы хотим изменить шифрование. ROT--n
эквивалентно ROT-26-n
, если это проще.) - преобразовать каждую входную строку в число, сложив относительные частоты символов.
e
is0
,t
is1
,a
is2
и т. д. Например, соответствующее число для строки"hello"
7 + 0 + 10 + 10 + 3 = 30. - найти строку с наименьшим соответствующим номером.
- выведите эту строку и соответствующую ей
n
.
Правила:
- ввод может быть в любом месте (STDIN, аргументы функции, из файла и т. д.), и поэтому может выводить (STDOUT, возвращаемое значение функции в файл и т. д.)
- Вы можете использовать другой алгоритм, если он всегда дает одинаковые результаты. Например,
z
иметь 0 иe
25 и выбирать наибольшее число тоже нормально. - если две строки имеют одинаковые оценки, вы можете выбрать выводить одну (или обе) из них. Это крайний случай, и вы не обязаны это учитывать.
- это код-гольф , поэтому выиграет самый короткий код в байтах!
Тестовые случаи:
Вход: ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
Выход:21 thisisaverysecretmessagethatisverysecureandsafe
Вход: pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
Выход:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
Вход: ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
Выход:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
Вход: jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
Выход:2 hereisthefinaltestcasethatyoumustdecrypt
Если вам интересно, вот JSFiddle из написанного мной тестового кода JavaScript, который успешно расшифровал все тестовые примеры, которые я к нему применил.
wtaad
должен давать0 wtaad
как результат, иvszzc
должен давать25 wtaad
как результат.