はじめに
『プロを目指す人のためのRuby入門』通称チェリー本を学習後、
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
「アウトプットのネタに困ったらこれ!?Ruby初心者向けのプログラミング問題を集めてみた(全10問)」
他の問題も解いています。
一問目:カレンダー作成問題(たのしいRuby 練習問題)
二問目:カラオケマシン作成問題
三問目:ビンゴカード作成問題
四問目:ボーナスドリンク問題
五問目:電話帳作成問題
ここに載っている一問目
「たのしいRuby」に載っている、オーソドックスなカレンダー作成問題です。
DateクラスのAPIさえわかれば、あとは基礎的なプログラミング知識だけでコードが書けると思います。Date クラスを使って、今月の1日と月末の日付と曜日を求め、次のような形式でカレンダーを表示させてください
こんな感じにするのが目標
May 2020
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
31
調べたところ色々な回答を見つけることができましたが、自分の回答はこんな感じになりました。
require 'date'
def monthly_calendar(this_day = Date.today) #実行日の日付
# 実行月の1日を抜きだす
first_day = Date.new(this_day.year,this_day.month,1)
# 月の最初の週の日曜日(カレンダー上で左上)に該当する日を抜き出す
start_day = first_day - first_day.strftime('%w').to_i
# month year
puts this_day.strftime('%B %Y').center(21)
# weekdays
puts "\sSu\sMo\sTu\sWe\sTh\sFr\sSa"
# days
while start_day.month <= first_day.month
if start_day.month != first_day.month
print "\s\s\s"
elsif start_day.strftime('%u') == "6"
print "\s" + start_day.strftime('%e') + "\n"
else
print "\s" + start_day.strftime('%e')
end
start_day += 1
end
end
puts monthly_calendar
引数に年と月だけ渡してみてもその月のカレンダーを表示することができました。
puts monthly_calendar(Date.new(1995,8)) #任意の月で指定もできる
August 1995
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 31
< 1995-08-01 >という日付で値が渡されるようです。
何か改善点等あればお教えください。