文字列の頻度分析する

単一換字暗号の課題がでたので
とりあえず、アルファベット文字を頻度分析してみる。

rubyで。

def char_frequency(str)
  table = Hash.new(0)
  str.scan(/./m){|ch|
    table[ch] += 1
  }
  table.to_a.sort_by{|char, count| -count}
end

 文字列が小さい小さい場合は、String#split(//)で文字ごとの
配列に分割する方がよいが、今回はString#scanを使っている。
 正規表現で「.」が改行(\n)にもマッチするようにmオプションを
つけておく。
 結果はソートして出力。

char_frequency("hogehogefugapiyo").each{|char count|
  puts "#{char.inspect}": #{count}
}

こんな感じで使える。
カウント回数を文字列の長さで割って割合で表した方がわかりやすいかも。

これで文字列の頻度はわかるけども、
英単語のボキャブラリーがない自分にとっては
これだけで予測していくのはなかなかキツイ。。。
そもそも単一換字暗号をプログラムだけで解決できるもん?

いざ
ブルートフォースアタック!!