兄の宿題を勝手にリファクタリング

一昨日からとうとうrubyの勉強を始めました。前々から「ruby素敵だな〜」と思いを募らせてはいましたが、如何せん始めの重〜い一歩へのモチベーションがなかなか得られなかったのです。
今回兄に'ruby関西勉強会'*1に誘われたのを期に「エイ!」と勉強開始です。

そんで、結局昨日僕は風邪で欠席したんですけどね。

兄が宿題を持って帰っていたので、読んでみたら意外と意味が解った。嬉しくて勝手に書き換えてみました。

char_count = 0;
word_count = 0;
line_count = 0;
chars = Hash.new(0)
words = Hash.new(0)
f = File.open("text.txt")

f.each do |l|
  char_count += l.size
  l.scan(/./m) { |c| chars[c] += 1 }

  l.strip.scan(/\w+|[^\s\w]+/) do |w|
    words[w]   += 1
    word_count += 1
  end
end

line_count = f.lineno
f.close

printf("文字数 %d\n", char_count)
printf("単語数 %d\n", word_count)
printf("行数 %d\n", line_count)

puts "文字出現頻度(文字 頻度(%) 回数)"
chars.sort_by {|c, n| -n }.each do |c, n|
  printf("%-10s %4.2f%% %5d\n",
    c.dump,
    100 * n/char_count.to_f,
    n
  )
end

puts "単語出現頻度(単語 頻度(%) 回数)"
words.sort_by {|w, n| -n }.each do |w, n|
  printf("%-10s %4.2f%% %5d\n",
    w,
    100 * n/word_count.to_f,
    n
  )
end

File.openでインデント入れなくしたのと、printfで横に長かったので、doブロックにして下に伸ばした。それだけ。
実兄にトラックバック*2

*1:兄弟で勉強会に出るってかなりおかしい

*2:これはきもい