今月の日曜日は何回?

antipop2.0経由で、Rubyのプログラムで今月「日曜日」が何回あるのか教えてください。という質問を拝見。

とのことで、けんたろさんがPerlのCalendar::Simpleモジュールを使った回答を提示されてますが、自分とこのPerlにはCalendar::Simpleを入れていなかったので、別解を考えてみました。

$ perl -le 'print 0 + grep /^.\d/, `cal`;'
5

calコマンドの出力頼りなところがいまいちなような。あと「日曜日」限定なところも。もし木曜日を対象にするならこのようにしないと。

$ perl -le 'print 0 + grep /^[ \d]{13}\d/, `cal`;'
4

註: ちなみにcalコマンドの出力はこのような感じです。

    October 2005
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
* * *

羊堂本舗で気になる言及があったので、1582年10月について検索してみたところ、福島中央テレビ ちょっと便利帳 日齢計算に簡潔な説明がありました。

なるほど。そういえばcalコマンドのmanpageでは1752年9月のカレンダーがおかしくなる旨の記述がありました。calコマンドはイギリス等の暦に従っているということのようです。

日本におけるグレゴリオ暦導入を見ると、日本では1872年(明治5年)の12月が2日しかなかったとのこと。暦は色々とややこしいなあ。

* * *

外部コマンド無し・標準モジュールのみ、という縛りをかけて、Time::Local を使う方法を考えてみました。

use Time::Local;
($m, $y) = (localtime)[4,5];
for (1 .. 31) {
    eval { $t = timelocal(0, 0, 0, $_, $m, $y) };
    $@ and last;
    (localtime $t)[6] or ++$c;
}
print $c;

これ以上は短くならないかなあ。