Ruby

カレンダーを表示する

以下のようにコマンドラインから起動するとカレンダーを表示してくれるプログラムです。引数がなければ、実行時の年月のカレンダーを、年と月が指定されていれば、当該年月のカレンダーを表示します。

$ ruby cal.rb
====== 2014/ 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

$ ruby cal.rb 2014 9
====== 2014/ 9 ======
     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

これは、Ruby教室の課題として出題したもので、以下が解答例です。仕様がバラバラになると大変なので、d1,d2を定義する行までは予め公開してありました。つまり、offsetの定義とd1,d2を使ったeachループの中身の実装方法が課題の骨子です(残念ながら正解者ゼロ!)。

require 'date'

year = ARGV[0] ? ARGV[0].to_i : Date.today.year
month = ARGV[1] ? ARGV[1].to_i : Date.today.month

puts "====== %4d/%2d ======" % [year,month]

d1 = Date.new(year,month,1)
d2 = Date.new(year,month,-1)

offset = d1.wday
offset.times do print " " end

(d1.day..d2.day).each do |d|
  print " %2d" % d
  if (d + offset) % 7 == 0 then
    print "\n"
  end
end
print "\n"

参考URL