ProjectEular

-- Problem 19

module Main (main) where

main :: IO ()
main = print $ problem19

problem19 :: Int
problem19 = length [ (year,month) | year  <- [1901..2000], month <- [1..12], isSunday year month 1 ]

isSunday :: Int -> Int -> Int -> Bool
isSunday year month day = zeller year month day == 1

-- Zeller's congruence
-- 0: Saturday, ..., 6: Friday
zeller :: Int -> Int -> Int -> Int
zeller year month day =
    mod (q + (div ((m+1)*26) 10) + k + (div k 4) + (div j 4) - (2*j)) 7
    where
        (j,k) = divMod (if month < 3 then year-1 else year) 100
        m = if month < 3 then month+12 else month
        q = day

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS