Doomsday rule: Difference between revisions

Content added Content deleted
(Added 11l)
m (→‎{{header|Haskell}}: HLint, Ormolu)
Line 556: Line 556:


instance Show Date where
instance Show Date where
show (Date {year = y, month = m, day = d}) = printf "%2d/%2d/%4d" m d y
show Date {year = y, month = m, day = d} =
printf "%2d/%d/%4d" m d y


leap :: Int -> Bool
leap :: Int -> Bool
leap year =
leap year = year`mod`4==0 && (year`mod`100/=0 || year`mod`400==0)
year `mod` 4 == 0
&& (year `mod` 100 /= 0 || year `mod` 400 == 0)


weekday :: Date -> Int
weekday :: Date -> Int
weekday (Date {year = y, month = m, day = d}) = (doom + d - anchor + 7) `mod` 7
weekday Date {year = y, month = m, day = d} =
where doom = (s + t + (t `div` 4) + c_anchor) `mod` 7
let doom = (s + t + (t `div` 4) + c_anchor) `mod` 7
anchor = dooms !! pred m
anchor = dooms !! pred m
c_anchor = (5 * mod c 4 + 2) `mod` 7
c_anchor = (5 * mod c 4 + 2) `mod` 7
dooms =
dooms = (if leap y then [4,1] else [3,7]) ++ [7,4,2,6,4,1,5,3,7,5]
(c, r) = y `divMod` 100
(if leap y then [4, 1] else [3, 7])
(s, t) = r `divMod` 12
<> [7, 4, 2, 6, 4, 1, 5, 3, 7, 5]
(c, r) = y `divMod` 100
(s, t) = r `divMod` 12
in (doom + d - anchor + 7) `mod` 7

days :: [String]
days :: [String]
days = words "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
days = words "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"


dates :: [Date]
dates :: [Date]
dates =
dates = [ Date { year = 1800, month = 1, day = 6},
Date { year = 1875, month = 3, day = 29},
[ Date {year = 1800, month = 1, day = 6},
Date { year = 1915, month = 12, day = 7},
Date {year = 1875, month = 3, day = 29},
Date { year = 1970, month = 12, day = 23},
Date {year = 1915, month = 12, day = 7},
Date { year = 2043, month = 5, day = 14},
Date {year = 1970, month = 12, day = 23},
Date { year = 2077, month = 2, day = 12},
Date {year = 2043, month = 5, day = 14},
Date { year = 2101, month = 4, day = 2} ]
Date {year = 2077, month = 2, day = 12},
Date {year = 2101, month = 4, day = 2}
]


dateAndDay :: Date -> String
dateAndDay :: Date -> String
Line 586: Line 594:


main :: IO ()
main :: IO ()
main = putStr $ unlines $ map dateAndDay dates </lang>
main = putStr $ unlines $ map dateAndDay dates</lang>
{{out}}
{{out}}
<pre> 1/ 6/1800: Monday
<pre> 1/6/1800: Monday
3/29/1875: Monday
3/29/1875: Monday
12/ 7/1915: Tuesday
12/7/1915: Tuesday
12/23/1970: Wednesday
12/23/1970: Wednesday
5/14/2043: Thursday
5/14/2043: Thursday
2/12/2077: Friday
2/12/2077: Friday
4/ 2/2101: Saturday</pre>
4/2/2101: Saturday</pre>


=={{header|Java}}==
=={{header|Java}}==