第 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" とか漢字とかは無視。