GUST NOTCH? DIARY

カレンダープログラミングコンテスト

「プログラミング生放送」でカレンダープログラミングコンテストというのをやっていたので、やってみました。

条件は

  • プログラミング言語は自由(既に応募がある言語でも OK)
  • コードを実行した当月の日曜始まりのカレンダーを出力する
  • 出力形式はサンプルを参考に、細かい点は自由

ということです。
汎用的に教科書的な手順としては以下のようになるでしょう。

  1. 今日の年月日を求める
  2. うるう年を考慮して、今月の1日の曜日を求める
  3. 書式を整えて出力する。

localtime() で年月日を取得し、Zellerの公式でその月の1日の曜日を求めます。各月の日数は配列に持っていて、うるう年についても考慮します。

自分で計算しなくても、mktime()で日付をセットしてlocaltime()を呼べば曜日が分かります。なので、今月1日の曜日をlocaltime()で求めます。

ちょっと毛色の違うアプローチをしてみます。localtime()を呼んだ時点で今日の日付と曜日は分かっているわけです。なので、それを利用します。考え方としては、アナログの万年カレンダーを配列として持ち、今日の曜日がとれる場所がどこかを探します。1日の曜日は求めていません。カレンダーとしてなりたつ範囲に限定することで、一意に決まります。

C言語版の「その3」と同じことをやっていることになりますが、今日の日付と曜日が分かっていれば、1日の曜日は分かります。それを計算で求めています。

  • Perl 版(その1)

C言語版の「その4」同じ方針での Perl版です。

  • Perl 版(その2)

モジュールを呼んでいいなら短くできます。

練習としてやってみました。