RosettaCodeData/Task/Doomsday-rule/Miranda/doomsday-rule.miranda

30 lines
1.1 KiB
Plaintext

main :: [sys_message]
main = [Stdout (lay [showdate d ++ ": " ++ weekday d | d<-tests])]
date ::= Date (num,num,num)
showdate :: date->[char]
showdate (Date (y,m,d)) = show m ++ "/" ++ show d ++ "/" ++ show y
tests :: [date]
tests = map Date [
(1800,1,6), (1875,3,29), (1915,12,7), (1970,12,23), (2043,5,14),
(2077,2,12), (2101,4,2)]
weekday :: date->[char]
weekday (Date (year,month,day))
= weekdays ! daynum
where weekdays = ["Sunday","Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday"]
doomtab = leapdoom, if leapyear
= normdoom, otherwise
leapdoom = [4,1,7,2,4,6,4,1,5,3,7,5]
normdoom = [3,7,7,4,2,6,4,1,5,3,7,5]
leapyear = year mod 4=0 & (year mod 100~=0 \/ year mod 400=0)
(c, r) = (year div 100, year mod 100)
(s, t) = (r div 12, r mod 12)
c_anchor = (5 * (c mod 4) + 2) mod 7
doom = (s + t + t div 4 + c_anchor) mod 7
anchor = doomtab ! (month - 1)
daynum = (doom + day - anchor + 7) mod 7