Life Goes On

まあまあだけど楽しんでる方です

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)