アルゴリズム
受け取った暗号化開始のすべての可能な置換をソートします。 1つ以上の数字がゼロから始まる置換は、不要として破棄されます。 置換ごとに、その使用から生じる算術式の結果を計算します。 この結果に置換からの数字がある場合、それらを対応する文字で置き換え、置換の置換からの文字で置き換えることができなかった数字を忘れないでください。 結果のパターンに適合する単語を辞書で探し、途中で見つかった各単語が順列のリストと一致する辞書に記入します。その結果、この単語が判明する可能性があります。 最後に、1回の置換(暗号には1つの解決策しかありません)から生じる可能性のある単語のみを選択して出力します。 頻度で降順で並べ替えて出力することができ、ごみ(およびWikipediaに多くのゴミ)が結果リストの下部に表示されます。
アルゴリズムの1つのステップを検討してください。
ユーザーが入力-Habr * Habr
アルゴリズムは別の置換を試みます。たとえば、x = 7、a = 6、b = 1、p = 8
最初に計算-7618 * 7618 = 58033924
結果の数字には8があり、これは文字pに対応するため、辞書でパターン5033924に一致するすべての単語(または単純に2番目の文字「p」と4番目と5番目の文字が一致する単語)を見つける必要があります。数字5、0、3、9、2、4は文字x、a、bに対応できないことに注意してください。 これらの文字は、すでにそれぞれ数字7、6、1で占められています。
アルゴリズムが機能する場合、1つの置換でのみ取得できる単語のみを残し、特に
、* Habr * Habr = trolling、7618 * 7618 = 58033924 (
注意!プログラムの作成者の意見は、実行の結果と一致しない場合があります暗号化)。
アルゴリズムの重要な部分は、巨大な辞書で特定のプロパティを持つ単語を検索することだけです。 これを行うために、辞書をロードするときに、プログラムはいくつかのインデックスを埋めます。
0)
word_list-すべての辞書の単語のリスト
1)
pattern_index-構造のインデックス。 単語の構造は、この関数によって決定されます。
def pattern(st): d={} rv=[] for l in st: if not(l in d): d[l]=len(d) rv.append(d[l]) return tuple(rv)
辞書のインデックスは構造体であり、値はすべての単語のセット(より正確には、単語自体ではなく、word_listのインデックス)であり、類似した構造を持っています。 この辞書の助けを借りて、文字の数と配置が指定された単語またはパターンと一致するすべての単語を即座に見つけることができます。
for i in pattern_index.get(pattern(u''),set()): print words_list[i],
カラカスカバカコサックバラバン注文ビリビンガラガン収入ドラムドラム注文ウズラ洪水収入ローターカラカルコサックキリキアキリキア注文注文belebey注文ローター引数2)
letters_order_index-文字の場所のインデックス。 キーは、単語の文字とそのシリアル番号です。 意味-この文字が特定の位置に立っているすべての単語のセット(より正確には...わかります)。
for i in letters_order_index.get((1,u''),set()): print words_list[i],
Bykovの声明ダイクは、スキーがスピーチであったように見える速歩者でした。3)
letters_existance_index-単語内の文字を見つけるためのインデックス。 キーは文字です。 意味は、すべての単語のセットです(より正確には... itd。)この文字が含まれています。
for i in letters_existance_index.get((1,u''), set()): print words_list[i],
発表された発表された結合共役は、食べられない負荷をドライブするために団結した運転を開始し、入口を持ち上げたボリュームの迂回を組み合わせた不可解なエントリを発表しましたなぜなら リストされたインデックスにはセット(セット)が含まれており、セットを使用して、ユニオン、インターセクション、差分などの操作を簡単に実行できます。
ワイルドカードの例で単語を検索する方法が完全に明らかになりました。
最初に、構造が58033924と同じすべての単語のセットを見つけ、次に2番目の文字「p」を持つ単語のセットとの交点を取得します。 「A」および「b」。 最終的に出てくるのは、x = 7、a = 6、b = 1、p = 8を置き換えるための多くの単語です。