"血をもって書け。そうすればあなたは、血が精神だということを経験するだろう。"

Problem19

次の情報が与えられている。

* 1900年1月1日は月曜日である。
* 9月、4月、6月、11月は30日まであり、2月を除く他の月は31日まである。
* 2月は28日まであるが、うるう年のときは29日である。
* うるう年は西暦が4で割り切れる年に起こる。しかし、西暦が400で割り切れず100で割り切れる年はうるう年でない。

20世紀(1901年1月1日から2000年12月31日)で月の初めの日曜日の数を数えよ。

haskell

main=print $ length $ filter ((==0) . wday ) [12..1211]
wday 0=1
wday (m+1)=(\x->mod x 7) $  (+(wday m)) $ head $ drop (mod m 12) $ mday $ isLeap $ div m 12
isLeap y
 |mod year 400==0 =True
 |mod year 100==0 =False
 |mod year 4==0   =True
 |otherwise       =False
 where year=y+1901
mday l=[3,if l then 1 else 0,3,2,3,2,3,3,2,3,2,3]

answer

172

問題の単純さの割に時間がかかる。なんかおかしい?

一日一チベットリンク

京五輪の聖火が30日、香港に到着した。約1カ月に及ぶ五大陸リレーを終え、5月2日の香港を皮切りに中国全土を巡る国内リレーが始まる。香港特別行政区政府はチベット問題に絡む混乱を抑えるため、歓迎式典の会場付近で厳重な警備体制をしいた。民主活動家が中国に人権改善を求める集会を開いたが、大きな混乱は無かった。