そこで、楽しみのために、約 75 文字の暗号文と、メッセージが 3 文字 (私の先生のイニシャル) で署名されたベビーベッドが与えられた、以前の大学の課題を再訪することにしました。
私がやったこと:
- ベビーベッドの一部またはすべてが含まれているものに結果を絞り込みました.
- 次に、(1) の結果の小さなサブセットに対して文字頻度分析を開始しました。
ここでのタスクは、いくつかの言語認識ソフトウェアを作成することになりますが、最初に対処する必要のある問題がいくつかあります。すべてのローター設定 (タイプ、初期位置) をブルート フォースすることを選択したので、ベビーベッドの一部またはすべてを含む結果のエントリには、プラグボードから交換された文字がまだいくつかあります。
私の次の動きは、2 つの行列を作成し、コーパスをダイジェストすることであることを知っています。最初の行列では、集計を行うだけです。最初の文字が A の場合、最初の行列では、行 0 になり、増加する列は、A の直後の文字であり、B であるとします。次に、B に移動し、次の文字が U であることを確認します。そのため、行 B に移動して列 U のエントリを増やします。コーパス全体を消化した後、確率を 2 番目の行列に入れます。
2 番目のマトリックスを使用して、スコア値をセンテンス全体に割り当て、出力をスコアリングして結果をさらに絞り込む手段を手に入れることができたので、メッセージを見つけることは、非常に小さな干し草の山からピンを見つけるのと同じくらい簡単なはずです。
今、私はPythonでこれを行っています.charをintにキャストする方が良いかどうか、最小のchar 'A'を減算してからそれをインデックスとして使用する方が良いかどうか、またはdictとeveryを使用する必要があるかどうかを知りたいと思いました.文字は int 値に対応するため、マトリックス内の位置のインデックスを見つけると、次のようになりますLetterTally[dict['A']][dict['B']]
。
キャスト減算メソッドは次のようになります。
firstChar = 'A'
secondChar = 'B'
LetterTalley[(ord(firstChar)-ord('A'))][(ord(secondChar)-ord('A'))]
これら 2 つの異なる方法のうち、どちらが高速でしょうか?