コード中の文字の頻度分析
出題者です。 こちらで用意していた回答は awk を使ったものでした。一応解説すると、組み込み変数FSを空にし、1行単位の文字毎に連想配列に格納しています。
1 2 3 4 5 6 7 8 9 | # 1文字版
BEGIN { FS="" }
{ for (i=1; i<=NF; i++) ht[$i]++}
END { for (c in ht) print ht[c],c }
# 3文字版
BEGIN { FS="" }
{ for (i=1; i<=NF-2; i++) { ht[$i$(i+1)$(i+2)]++}}
END { for (c in ht) print ht[c],c }
|
Posted feedbacks - Ruby
どういう訳かまだRubyがないので。 net/http.rbを対象にしてみました。 空白を別にすれば,e が飛び抜けて多いのは end が多いのも影響 してるんでしょうか。 ^o^ >ruby hist_char.rb c:/usr/ruby/lib/ruby/1.8/net/http.rb " ": 18072 "e": 4839 "t": 2982 "s": 2574 "r": 2525 "n": 2290 "\n": 2274 "o": 2245 "a": 1945 "d": 1757 "i": 1700 "T": 1216 "l": 1183 "p": 1125 "#": 1106 (以下略)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | src = File.read(ARGV.shift)
hist = {}
src.each_byte do |c|
c = c.chr
if hist.member?(c)
hist[c] += 1
else
hist[c] = 1
end
end
hist.to_a.sort{|a,b| b[1] <=> a[1]}.each do |pair|
puts "#{pair[0].inspect}: #{pair[1]}"
end
|
以下でもOKですね。 hist = Hash.new(0) src.each_byte do |c| hist[c.chr] += 1 end




crane
#6382()
Rating0/0=0.00
プログラムコード中の文字の頻度は言語によって相当にばらつきがあると思います。ある言語はピリオドが頻出するとか、別の言語はカッコの頻出頻度が高い、とか。そこで、
(その言語で書かれた「典型的な」プログラムコード、といえるようなものがあると良いのですが・・)
簡単すぎるという方は、複数文字にしてみたり単語の頻度にしてみてください。
参考;Wikipedia 頻度分析
http://ja.wikipedia.org/wiki/%E9%A0%BB%E5%BA%A6%E5%88%86%E6%9E%90
1 reply [ reply ]