2016-11-24 7 views
0

課題が与えられていて、ほぼ完了しました。最後のビットで苦労しています。プログラムはシーザー暗号テキストを与えられ、次に最も頻繁な文字が何であるかを調べ、これを端末に印刷します。 (私が行っているところで) これは、最も頻繁な文字に基づいてキーシフトを提案し、ユーザはこのキーシフト、またはそれ自身のキーシフトを手動で入力することができ、テキストは解読される。文字の違いを調べるpython

私は、シーザーテキストの中で最も頻繁に出てくる文字を取り、それを英語の中で最も頻繁に出てくる文字である「E」と比較して、それがどれだけ離れているかを調べるプログラムが必要です。

たとえば事前に

import sys 

def decrypt(plain, key): 
"returns a Caesar cipher text given plain text and a key" 
    cipher = "" 
for index in range(len(plain)): 
if plain[index].isalpha():  
    if plain[index].islower(): 
    cipher = cipher + chr((ord(plain[index]) -101- key+26) % 26+ 101) 
    else: 
    cipher = cipher + chr((ord(plain[index]) -65- key+26) % 26+ 65) 
else: 
    cipher = cipher + plain[index] 


    return cipher   #do nothing here 

    #main program 

key = int(sys.argv[4]) 
action = sys.argv[2] 

try: 
    in_file = open(sys.argv[1], "r") 
except: 
sys.exit("There was an error opening the file: {}".format(sys.argv[1])) 

try: 
    out_file = open(sys.argv[3], "w") 

except: 
sys.exit("There was an error opening the file: {}".format(sys.argv[3])) 

line = in_file.readline() 

freq_dict = { }#letter : 0 for letter in LETTERS } 



while len(line) != 0: 
for letter in line.replace(" ",""): 
    if letter in freq_dict: 
     freq_dict[letter] += 1 
    else: 
     freq_dict[letter] = 1 
line = in_file.readline() 


cipher = decrypt(line, key) 
out_file.write(cipher) 



in_file.close() 
out_file.close() 

for letter in freq_dict: 
print(letter, "times", freq_dict[letter]) 

ありがとう:最も一般的なシーザーテキスト文字は、これまでに= 9

コードのn-E Nである場合。

+0

ベース(ゼロシフト)リファレンスには何を使用していますか?文字列、リスト、すべての文字の辞書? [string.ascii_letters](https://docs.python.org/3/library/string.html#string.ascii_letters)が便利かもしれません。そうすれば[str.find](https://docs.python)を使うことができます。 org/3/library/stdtypes.html#str.find)。 – wwii

+0

こんにちは、お返事ありがとうございます。私は基本参照としてEを使用するつもりです。次に、最も頻繁に使用されるシーザー文字の手紙がいくつあるのかを考えてみたいと思います。もう一度ありがとう – helpme123

+0

MITのedxコースからこの問題を解決していますか? –

答えて

0

したがって、あなたのdecrypt関数は本質的に、現在キーでシフトされた入力テキスト文字列を出力しているようです。

私が理解していることから、あなたがしたいことは、この文字列で最も頻繁に出現する文字を見つけることです。

あなたは今、すべてのあなたのmost_freq手紙とe間のシフトを見つけることですが残され、この

import collections 
most_freq = collections.Counter(cipher).most_common(1)[0] 

行うにcollectionsモジュールを使用することができます。

おそらく、最も簡単な方法は、リスト内のアルファベットを列挙し、その2つのインデックスの違いを見つけることです。

alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] 

shift = alphabet.index(most_freq) - alphabet.index('e') 

このシフトを忘れないでください、あなたのテキストへのシフトを適用するときにあなたが正しい結果を得るために、反対(-1 * shift)を適用する必要がありeからごmost_freq手紙にあなたを取得します。

これが役に立ちます。

関連する問題