Rubyで統計

現在、昔のネタをいくつか放出中。

ruby-talk:165395 I rea......lly need your help ( C++ ) にて、「C++で困っているから助けて」という明後日なスレ。寛容なRubyist達も「板違いだ」とか「宿題はあっちでやれ」みたいな痛いレスが続く。そんな中、Nakada氏の美しいコードのレスが登場。

  > Calculate and display the average, median, and mode of the values
  > entered.
 
  students = []
  ARGF.each do |line|
    /^\d+$/ =~ line or break
    students << line.to_i
  end
  mode, = students.inject(Hash.new(0)) {|h, s| h[s] += 1; h}.max_by {|s, n| n}
  avrg = students.inject(0) {|a, s| a + s}.to_f / students.size
  require 'pp'
  print "The array is: "
  pp students
  puts "The Mode is #{mode}."
  puts "The average is #{avrg}."

Hash の max_by が key, value になるところが気が利いていて素敵。また、inject と Hash の代入式の使い方も大変参考になる。いろいろ調べるとこういう Hash の使い方は定石らしい。

MLでも「感動した」のレスが幾つか付いていた。