koyoweblog log

2010/10/11 までの http://d.hatena.ne.jp/sasashin の記事をインポートしただけです。

Re:日付のRangeを週に切り出すスクリプト

日付のRangeを週に切り出すスクリプト - はこべにっき# より。

元のテストを通るように書くとこんな感じ。tapかわいいよtap。inject もかわいいけどねー。

require 'date'

# 1.8.7 以降では不要(ASR の最新は 1.8.6 だから…)
class Object
  def tap
    yield(self)
    self
  end
end

def gen_week(range, week_start=1)
  [[]].tap do |weeks|
    range.each do |date|
      if date.wday == week_start and weeks.last.size != 0
        weeks << [date]
      else
        weeks.last << date
      end
    end
  end.map{|week| week.first..week.last }
end

これって、以前書いた 連続した数列を範囲形式にまとめたい とほとんど同じだなー。

追記

zt日記 に、1.8.7 以降で使用できる Enumerable#group_by による解法あり。簡潔だ…。