私のレッスンでは、入力の文字列を受け取り、文字の頻度を使用して可能な限り最良の文字列を見つけるシーザー暗号デコーダーを作成するという任務を負いました。それがどれほど意味があるかわからない場合は、質問を投稿しましょう:
次のことを行うプログラムを作成します。まず、エンコードされたメッセージである1行の入力を読み取る必要があり、大文字とスペースで構成されます。プログラムは、シフトSの26の可能な値すべてを使用してメッセージのデコードを試行する必要があります。これらの26の可能な元のメッセージのうち、最高の良さを持っているものを印刷します。便宜上、変数letterGoodnessを事前に定義します。これは、上記の度数分布表の値に等しい長さ26のリストです。
私はこれまでにこのコードを持っています:
x = input()
NUM_LETTERS = 26 #Can't import modules I'm using a web based grader/compiler
def SpyCoder(S, N):
y = ""
for i in S:
x = ord(i)
x += N
if x > ord('Z'):
x -= NUM_LETTERS
elif x < ord('A'):
x += NUM_LETTERS
y += chr(x)
return y
def GoodnessFinder(S):
y = 0
for i in S:
if x != 32:
x = ord(i)
x -= ord('A')
y += letterGoodness[x]
return y
def GoodnessComparer(S):
goodnesstocompare = GoodnessFinder(S)
goodness = 0
v = ''
for i in range(0, 26):
v = SpyCoder(S, i)
goodness = GoodnessFinder(v)
if goodness > goodnesstocompare:
goodnesstocompare = goodness
return v
y = x.split()
z = ''
for i in range(0, len(y)):
if i == len(y) - 1:
z += GoodnessComparer(y[i])
print(z)
編集:CristianCiupituによって提案された変更を加えましたインデントエラーは無視してください。コードをコピーしたときに発生した可能性があります。
プログラムは次のように機能します。
- 入力を取得し、リストに分割します
- すべてのリスト値について、私はそれを良さのファインダーに送ります。
- それは弦の良さを取り、他のすべてを比較し、より高い良さがあれば、より高いものを比較する良さにします。
- 次に、そのテキストの文字列をi量だけシフトして、良さが高いか低いかを確認します。
問題がどこにあるのかよくわかりません。最初のテスト:LQKP OG CV GKIJV DA VJG BQQ
正しいメッセージを出力します:JOIN ME AT AT BY THE ZOO
ただし、次のテスト:UIJT JT B TBNQMF MJOF PG UFYU GPS EFDSZQUJOH次
のジャンク文字列を指定します:SGHR HR Z RZLOKD KHMD NE SDWS ENQ
CDBQXOSHMF
私は私がしなければならないことを知っています:
すべてのシフト値を試してください
単語の「良さ」を取得し
ます最高の良さを持つ文字列を返します。
私は今かなり混乱しているので、私の説明が理にかなっていることを願っています。