Let's write β

プログラミング中にできたことか、思ったこととか

Project Eular Problem 19

Haskellで単調に

import Data.List

isLeapYear :: Int -> Bool
isLeapYear y
        | (y `mod` 4 == 0 && (not (y `mod` 400 /= 0 && y `mod` 100 == 0))) = True
        | otherwise =  False 
        
dayList :: Int -> [Int]
dayList y
        | isLeapYear y = [31]++[29]++[31,30,31,30,31,31,30,31,30,31]
        | otherwise = [31]++[28]++[31,30,31,30,31,31,30,31,30,31]
        
problem :: Int
problem = length $ filter (\x -> x `mod` 7 == 0 && x > 365) $ reverse $ foldl (\acc x -> (x+head acc):acc) [1] $ concat $ [dayList x | x <- [1900..2000]] 

閏年かどうかの判定をして、その歳の月のそれぞれの日数のリストを返してます。
そして、その日数のリストを1900年から2000年まで結合し、foldlする事で1900年1/1を1としたときの日数を計算しています。すると、この日数が7でわりきれる物が日曜日になります。問題は1901年からなので、一年以上たっている物だけを抽出しています。