challenge コード中の文字の頻度分析

プログラムコード中の文字の頻度は言語によって相当にばらつきがあると思います。ある言語はピリオドが頻出するとか、別の言語はカッコの頻出頻度が高い、とか。そこで、

  • 文字の頻度解析をするプログラムを作成し、
  • 適当なプログラムに対して実行し、結果を出力して、そのような頻度になっている理由を教えてください。

(その言語で書かれた「典型的な」プログラムコード、といえるようなものがあると良いのですが・・)

簡単すぎるという方は、複数文字にしてみたり単語の頻度にしてみてください。

参考;Wikipedia 頻度分析

http://ja.wikipedia.org/wiki/%E9%A0%BB%E5%BA%A6%E5%88%86%E6%9E%90

出題者です。 こちらで用意していた回答は 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


Index

Feed

Other

Link

Pathtraq

loading...