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 =[,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==&&y`mod`100/=||y`mod`400==
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(==). map snd.takeWhile((<(2001,1)).fst)$dropWhile((<(1901,1)).fst) dayFrom
More Reading
Newer// Problem 18
Older// Problem 20