以下に、頻度の高い順に英語のアルファベットの文字を示します。
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の半分)を介して「暗号化」されたテキスト「thisisaverysecretmessage thatvery secure and safe」です。プログラムは、上記の頻度表を使用して、各文字がどれだけ回転したかと元のテキストによって判断できるはずです。
(ROT-nに慣れていない場合は、基本的に各文字をn
。でシフトします。たとえば、ROT-2では、a -> c, b -> d, ..., x -> z, y -> a, z -> b
。)
どうして?使用する必要がある(非常に単純な)アルゴリズムは次のとおりです。
n
fromから0
to25
までのそれぞれについて、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
0e
で25であっても、最大数を選択しても問題ありません。 - 2つの文字列のスコアが同じ場合、どちらか(または両方)を出力することを選択できます。これはエッジケースであり、説明する必要はありません。
- これはcode-golfなので、バイト単位の最短コードが勝ちます!
テストケース:
入力:ocdndnvqzmtnzxmzohznnvbzocvodnqzmtnzxpmzviynvaz
出力:21 thisisaverysecretmessagethatisverysecureandsafe
入力:pmttwxmwxtmwnxzwoziuuqvoxchhtmakwlmowtnabiksmfkpivom
出力:8 hellopeopleofprogrammingpuzzlescodegolfstackexchange
入力:ftueimeqzodkbfqpiuftdaffiqxhqeaufygefnqbqdrqofxkemrq
出力:12 thiswasencryptedwithrottwelvesoitmustbeperfectlysafe
入力:jgtgkuvjghkpcnvguvecugvjcvaqwowuvfgetarv
出力:2 hereisthefinaltestcasethatyoumustdecrypt
あなたは不思議に思った場合は、ここで成功した私はそれで投げたすべてのテストケースを復号化し、私が書いたJavaScriptのテストコードのJSFiddleは、あります。
wtaad
与える必要があり0 wtaad
、結果として、そしてvszzc
与える必要があり25 wtaad
、結果として。