19問目
http://projecteuler.net/index.php?section=problems&id=19
20世紀で月初が日曜となる回数を求める。
main = print $ euler019 1901 2000 euler019 :: Int -> Int -> Int euler019 begin end = length $ filter (== 0) [dayOfWeek year month | year <- [begin..end], month <- [1..12]] dayOfWeek :: Int -> Int -> Int dayOfWeek 1900 1 = 1 dayOfWeek year 1 = mod ((dayOfWeek (year - 1) 12) + (daysOfMonth (year - 1) 12)) 7 dayOfWeek year month = mod ((dayOfWeek year (month - 1)) + (daysOfMonth year (month - 1))) 7 daysOfMonth :: Int -> Int -> Int daysOfMonth year month = days !! (month - 1) where days = [31, if isLeapYear year then 29 else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] isLeapYear :: Int -> Bool isLeapYear year = (mod year 4 == 0 && mod year 100 /= 0) || (mod year 400 == 0)