Problem 19

You are given the following information, but you may prefer to do some research for yourself.
1 Jan 1900 was a Monday.
Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
A leap year occurs on any year evenly divisible by 4, but not on a century unless it is divisible by 400.

How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)?

これは日数を数えればいいと思うんですね。で7で割ると。遅延評価って便利。

days =[0,31,28,31,30,31,30,31,31,30,31,30,31]
day (year,month)| isLeap year&& month==2 =29
                | otherwise = days!!month
    where isLeap y =y`mod`4==0&&y`mod`100/=0||y`mod`400==0
dayFrom =((1900,1),1):[(next ym,mod (d+day ym)7)|(ym,d)<-dayFrom]
    where next (y,m) | m==12 = (y+1,1)
                     | otherwise = (y,m+1)
p019 = length .filter(==0). map snd.takeWhile((<(2001,1)).fst)$dropWhile((<(1901,1)).fst) dayFrom