Array#product
arikui1911さんに教えていただいたArray#productを使ってみた。Ruby 1.9系もしくはRuby 1.8.7以降で追加されたメソッドらしい。productって積ってことだから、集合の積だよね、まさにこれは求めていたものという気がする。
[1,2,3].product([4,5]) # => [[1,4],[1,5],[2,4],[2,5],[3,4],[3,5]]
FRIDAY = 5 jason = Hash.new(0) years = (1902..2037).to_a months = (1..12).to_a years.product(months).each do |y,m| if Time.mktime(y,m,13).to_a[6] == FRIDAY jason[y] = jason[y] + 1 end end years.each do |y| print y, ":", jason[y], "\n" end
ただまあ、今の例では年と月とをごっちゃにしてしまうと、結局年ごとの集計のために別途ハッシュを使ったりして面倒だという当たり前の事実があったりして……。
それにしても、どうせ趣味なんだし、Ruby1.8.6とか捨ててRuby1.9系だけ使っていればいいような気がしてきた。