るびー めも

Ruby の学習メモを記す

たのしい Ruby 第2版 第17章 Time クラスと Date クラス 練習問題(3)

問題は、以下のとおり

Date クラスを使って、今月の1日と月末の日付と曜日を求め、次のような形式でカレンダーを表示させてください

      April 2013
 Su Mo Tu We Th Fr Sa
     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

私の回答は、以下です。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# by Yuji Shimoda

require "date"

t = Date.today

# Get the Month's First Day
d_start = Date.new(t.year, t.month, 1)

# Get the Month's Last Day
d_end = Date.new(t.year, t.month, -1)

# Print Header
puts
print "      ",t.strftime("%B %Y"),"\n"
print " Su Mo Tu We Th Fr Sa\n"

# Get the day. Sun->0 Mon->1 ... Sat->6
wday = d_start.strftime("%w").to_i

# Print Calendar
print "   " * wday

for i in 1..d_end.day
	if wday != 6 
		if i < 10
			print "  ",i
		else
			print " ",i
		end
		wday += 1
	else
		wday = 0
		if i < 10
			print "  ",i,"\n"
		else
			print " ",i,"\n"
		end
	end
end
print "\n\n"

あんまり、スマートなソースではないですね。

模範解答は、以下のリンクを参照のこと。
http://www.notwork.org/tanoshiiruby2/answer/

以下、追記

西脇.rb の伊藤さんに、本問題を取り上げて頂きました。
第2版のコードは、gist に上げてます。
Chapter17_Practice3.rb

コードをレビューするなら、github 使うのが読みやすいし今っぽいですね。笑
ただ、伊藤さんの記事みたいにコードの処理を解説するならブログ形式に分がありますね。

MVC やらオブジェクト指向が身に付いてなくて、頑張らねばと思った次第