RosettaCodeData/Task/Doomsday-rule/SETL/doomsday-rule.setl
2025-02-27 18:35:13 -05:00

29 lines
1,005 B
Text

program doomsday;
tests := [[1800,1,6], [1875,3,29], [1915,12,7], [1970,12,23],
[2043,5,14], [2077,2,12], [2101,4,2]];
loop for [year, month, day] in tests do
print(str day + "/" + str month + "/" + str year + ": " +
weekday(year, month, day));
end loop;
proc leap(y);
return y mod 4 = 0 and (y mod 100 /= 0 or y mod 400 = 0);
end proc;
proc weekday(year, month, day);
leapdoom := [4,1,7,4,2,6,4,1,5,3,7,5];
normdoom := [3,7,7,4,2,6,4,1,5,3,7,5];
weekdays := ["Sunday","Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday"];
c := year div 100;
r := year mod 100;
s := r div 12;
t := r mod 12;
c_anchor := (5 * (c mod 4) + 2) mod 7;
doom := (s + t + (t div 4) + c_anchor) mod 7;
anchor := if leap(year) then leapdoom else normdoom end(month);
return weekdays((doom+day-anchor+7) mod 7+1);
end proc;
end program;