カレンダー的なものの作成

最近あまりコードを書いていなかったので、とりあえず簡単なものでも。

require 'date'

t =  Date.today
t.wday  # => 0

def days_of_month m, y=Date.today.year
  Date.new(y,m+1,1) - Date.new(y,m,1)
end

def days_list m,y=Date.today.year
  days = days_of_month m, y
  n = Date.new(y,m,1).wday
  x = Array.new(n,"*")
  x.concat((1..days).map(&:to_s))
end

def layout xs
  xs.to_enum(:each_slice,7).map{ |e| e}
end

days_of_month 9 # => Rational(30, 1)
x = days_list 8 # => ["*", "*", "*", "*", "*", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"]
layout(x).each{ |days| days.each{ |day| printf("%2s ", day) }; puts}
# >>  *  *  *  *  *  1  2 
# >>  3  4  5  6  7  8  9 
# >> 10 11 12 13 14 15 16 
# >> 17 18 19 20 21 22 23 
# >> 24 25 26 27 28 29 30 
# >> 31