30 lines
1.1 KiB
Plaintext
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
|