「プログラミング生放送」でカレンダープログラミングコンテストというのをやっていたので、やってみました。
条件は
- プログラミング言語は自由(既に応募がある言語でも OK)
- コードを実行した当月の日曜始まりのカレンダーを出力する
- 出力形式はサンプルを参考に、細かい点は自由
ということです。
汎用的に教科書的な手順としては以下のようになるでしょう。
- 今日の年月日を求める
- うるう年を考慮して、今月の1日の曜日を求める
- 書式を整えて出力する。
- C言語版(その1)
localtime() で年月日を取得し、Zellerの公式でその月の1日の曜日を求めます。各月の日数は配列に持っていて、うるう年についても考慮します。
- C言語版(その2)
自分で計算しなくても、mktime()で日付をセットしてlocaltime()を呼べば曜日が分かります。なので、今月1日の曜日をlocaltime()で求めます。
- C言語版(その3)
ちょっと毛色の違うアプローチをしてみます。localtime()を呼んだ時点で今日の日付と曜日は分かっているわけです。なので、それを利用します。考え方としては、アナログの万年カレンダーを配列として持ち、今日の曜日がとれる場所がどこかを探します。1日の曜日は求めていません。カレンダーとしてなりたつ範囲に限定することで、一意に決まります。
- C言語版(その4)
C言語版の「その3」と同じことをやっていることになりますが、今日の日付と曜日が分かっていれば、1日の曜日は分かります。それを計算で求めています。
- Perl 版(その1)
- Perl 版(その2)
モジュールを呼んでいいなら短くできます。
練習としてやってみました。