第 24 回 Ruby/Rails 勉強会の宿題。
先生が添削してくれるらしいので書いてみる。
ファイルの行数、単語数、文字数を数える。
def words(a) a.join.sub(/^\W+/, "").split(/\W+/) end a = ARGF.readlines puts "#{a.size} lines." puts "#{words(a).size} words." puts "#{a.join.size} characters."
単語って何だろう?
/\w+/ が単語でいいのか?
wc(1) は、空白、タブ、改行で区切られた文字列が単語らしい。
wc(1) では "/usr/local/bin" は 1 語だけど、上のスクリプトでは 3 語と数える。
単語ごとの登場回数。
w = Hash.new(0) ARGF.readlines.join.sub(/^\W+/, "").split(/\W+/).each do |i| w[i] += 1 end w.sort_by{|k, v| v}.each do |k, v| printf("%8d: %s\n", v, k) end
文字ごとの登場回数。
sum = Hash.new(0) ARGF.readlines.join.split(//).each do |i| sum[i] += 1 end ascii = (0x20..0x7e).map{|c| c.chr} 0.step(ascii.size-1, 8) do |i| puts ascii[i..i+7].map{|c| sprintf("%6d %s", sum[c], c)}.join end
表示可能な文字だけ表示。
"\t" とか "\n" とか漢字とかは無視。