以下是按频率顺序排列的英文字母的字母:
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
也是最不常用的字母。(来自Wikipedia的数据。)
您面临的挑战是获取一些ROT文本,例如:
ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
这是通过ROT-21(42的一半)“加密”的文本“ thisisaverysecretmessageverysecureandsafe”。使用上面的频率表,您的程序应该能够确定每个字符旋转了多少以及原始文本。
(如果您不熟悉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
wtaad
应该给出0 wtaad
结果,并且vszzc
应该给出25 wtaad
结果。