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年からなので、一年以上たっている物だけを抽出しています。