-4

暗号化されたテキスト ファイルを読み取り、さまざまな方法で復号化する Python スクリプトがあります。私が追加しようとしている最後の 2 つのオプションは、ファイルで最も頻繁に使用される文字と、英語で最も頻繁に使用される文字をマッピングすることです。

頻度を表示する以前の関数は次のとおりです。

def functOne:
    Crypt = input("what file would you like to select? ")
    filehandle = open(Crypt, "r")
    data = filehandle.read().upper()
    char_counter = collections.Counter(data)
    for char, count in char_counter.most_common():
        if char in string.ascii_uppercase:
            print(char, count)

def FunctTwo: 
    print "Relative letter Freq of letters in English Language A-Z; ENGLISH = (0.0749, 0.0129, 0.0354, 0.0362, 0.1400, 0.0218, 0.0174, 0.0422, 0.0665, 0.0027, 0.0047, 0.0357, 0.0339, 0.0674, 0.0737, 0.0243, 0.0026, 0.0614, 0.0695, 0.0985, 0.0300, 0.0116, 0.0169, 0.0028, 0.0164, 0.0004)"

次の 2 つのために必要な作業の説明を次に示します。

機能 3:

テキストで最も頻繁に使用される文字を、英語で最も頻繁に使用される文字に降順でマッピングします。

[letter in cryptogram] -> [letter in english language]

機能 4:

ユーザーが周波数マップを手動で編集できるようにする

どうすればこれを行うことができますか?少なくとも 2 つの周波数を組み合わせて編集できるようにすることで、マッピングの部分で少し迷っています。

4

1 に答える 1

2

まず、コードを実際の有効な Python コードに変換する必要があります。たとえば、関数は引数のリストで定義する必要があります。

次に、単に値を出力するのではなく、値を返す必要があります。

また、周波数のタプルの文字列表現ではなく、使用できる実際のタプルが必要です。

最後に、2 つのコレクションを比較可能な何らかの形式に変換する必要があります。ENGLISH26個の周波数のシーケンスです。によって計算される値functOneは、頻度の降順で最大 26 個の (文字、カウント) ペアのシーケンスです。しかし実際には、カウントや頻度はまったく必要ありません。頻度の降順で文字が必要なだけです。

実際、これfunctTwoは完全に不必要です。定数を効果的に計算しているので、モジュール レベルでそれを行うだけでよいのです。

その間に、入力を引数として受け取るように functOne を再編成します。ファイルをリークするのではなく、ファイルを閉じます。そして、関数に意味のある名前を付けます。

def count_letters(data):
    data = data.upper()
    char_counter = collections.Counter(data)
    return [char for char, count in char_counter.most_common()]

english_freqs = (0.0749, 0.0129, 0.0354, 0.0362, 0.1400, 0.0218, 0.0174, 
                 0.0422, 0.0665, 0.0027, 0.0047, 0.0357, 0.0339, 0.0674, 
                 0.0737, 0.0243, 0.0026, 0.0614, 0.0695, 0.0985, 0.0300, 
                 0.0116, 0.0169, 0.0028, 0.0164, 0.0004)
pairs = zip(english_freqs, string.ascii_uppercase)
english_letters = [char for count, char in sorted(pairs, reversed=True)]

def decrypt(data):
    input_letters = count_letters(data)
    return {input_letter: english_letter
           for input_datum, english_datum in zip(input_letters, english_letters)}

crypt = input("what file would you like to select? ")
with open(crypt, "r") as f:
    data = f.read()
mapping = decrypt(data)

編集機能については…実装する前に、インターフェイスをどのようにしたいかを設計する必要があります。しかしおそらく、english_freqsオブジェクトを編集し (つまり、 a のlist代わりに aを使用したい場合があることを意味しますtuple)、それから再構築english_lettersします (つまり、最終的には関数でそれが必要になる場合があることを意味します)。

于 2013-11-12T04:00:55.907 に答える