Вот буквы английского алфавита по порядку по частоте:
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
как результат.Ответы:
GolfScript - 87
Обман здесь, чтобы построить каждое вращение одновременно. Поскольку нам нужно циклически проходить каждый ROT, то каждый символ, давайте просто зациклим каждый символ, нарежем весь алфавит, а затем сожмем его. Оттуда действуйте, как и ожидалось: подсчитайте баллы для каждого ROT и выберите минимум.
Дополнительный гольф:
Только немного в гольф:
источник
Haskell -
192175Бег
источник
[1,1,1,1]
, и это даст тот же порядок. Затем происходит сопоставление и суммирование,concatMap
которые можно записать кратко, используя понимание списка. В сочетании с некоторыми другими трюками, я укоротил до 152 символов:main=interact(\s->snd$minimum[([1|x<-r,_<-fst$span(/=x)"etaoinshrdlcumwfgypbvkjxqz"],show(26-n)++' ':r)|n<-[0..25],r<-[[([x..'z']++['a'..])!!n|x<-s]]])
.GolfScript,
112108102100 символовЯ не рад повторению с повторным расшифровыванием в конце, но ме.
Ungolfed (если это имеет смысл: P) и немного более старая версия:
источник
echo
что по умолчанию ставит новую строку, которую переводчик подхватывает.JavaScript (205)
Я думаю, что все еще можно играть в гольф немного больше, поэтому предложения приветствуются!
Некоторые примечания, чтобы помочь понять решение
m
,n
Иo
отслеживать самые высокие оценки.u
а такжеw
отслеживать символ и значение результата, соответственно для текущегоi
(a+a)
помогает предотвратить переполнение при обтеканииz
и короче, чем выполнение%26
Доказательство: http://jsfiddle.net/J9ZyV/5/
источник
indexOf
переменную.C # + Linq -
273264Как функция, которая принимает входную строку и возвращает декодированную строку и смещение (согласно требованиям):
Разоблаченный с комментариями:
Маленький тестовый драйвер (не забудьте скомпилировать ссылки
System.Core
для Linq):Предоставление:
источник
Tuple<string,int> d
Tuple<int,string>f(string x){return Enumerable.Range(0,25).Select(n=>Tuple.Create(26-n,string.Concat(x.Select(c=>(char)((c-97+n)%26+97))))).OrderBy(t=>(t.Item2.Select(c=>"etaoinshrdlcumwfgypbvkjxqz".IndexOf(c))).Sum()).First();}
Range(0, 26)
, а не25
.дг -
137130129128 байтПримеры:
Ungolfed код:
источник
c - 97
и(0..26)
?dg
раньше. Не могли бы вы предоставить ссылку?J - 92 символа
Немного гадкого утенка, но это работает. Выводит число, а затем строку в две строки.
Если вы хотите, чтобы они находились на одной линии, разделенные пробелами, это только увеличит до 93 символов , но пойдет по более уродливому маршруту.
Объяснение для
(/:'ctljapqhewvknfdsyigbmuoxrz')
: В этом глаголе мы оперируем буквенными значениями как A = 0, B = 1, C = 2 и т. Д. Чтобы закодировать буквенные значения строкиetaoinshrdlcumwfgypbvkjxqz
, самый короткий путь - фактически принять перестановку сортировки для этого странная строка Это связано с тем, что A имеет индекс 4, B - индекс 19, C - 0, D - 14 и т. Д .; следовательно, перестановка сортировки - это4 19 0 14 8 13 ...
когда вы оцениваете/:
ее, и вы получаете точно числовые значения дляetaoin...
.Использование:
источник
Q, 97
,
источник
APL - 70 символов
Пример:
Я уверен, что есть способы сжимать это дальше, и я приглашаю всех других пользователей APL придумать решения для этого.
источник
Python 188
источник
Perl: 256 символов (плюс новые строки для удобства чтения), включая таблицу частот:
Текст предоставляется так:
Снимите 12 символов, если хотите запечь значения ord (a) и длину @f
источник
Вяз - 465
Не собираюсь выигрывать какие-либо награды в гольфе, но он создает статическую веб-страницу, которая отображает список форм по
[(rotation number, rotated string)]
мере ввода.Примечание: здесь еще не работает, но вы можете скопировать и вставить его в официальный редактор и запустить его.
источник
Python 2, 171
источник