antipop2.0経由で、Rubyのプログラムで今月「日曜日」が何回あるのか教えてください。という質問を拝見。
「今月」はプログラム実行時のシステム時間でかまいません
Rubyがダメな人は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月について検索してみたところ、福島中央テレビ ちょっと便利帳 日齢計算に簡潔な説明がありました。
- カトリック国のイタリア、スペインなどでは、1582年10月にユリウス暦からグレゴリオ暦への切り替えが行われ、1582年10月5日から10月14日までが存在しません。1582年10月4日の次が10月15日になりました。
- 一方、プロテスタント国のイギリスやその植民地などでは1752年9月に切り替えが行われ、これらの国では、1752年9月3日から9月13日までが存在しません。1752年9月2日の次が9月14日でした。
なるほど。そういえば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;
これ以上は短くならないかなあ。