RosettaCodeData/Task/Doomsday-rule/Refal/doomsday-rule.refal

44 lines
1.4 KiB
Plaintext

$ENTRY Go {
, (1800 1 6) (1875 3 29) (1915 12 7) (1970 12 23)
(2043 5 14) (2077 2 12) (2101 4 2): e.Tests
= <Each (Test) e.Tests>;
};
Test {
e.Test = <Prout e.Test <Weekday e.Test>>;
};
LeapYear {
s.Year = <And <Eq 0 <Mod s.Year 4>>
<Or <Neq 0 <Mod s.Year 100>>
<Eq 0 <Mod s.Year 400>>>>;
};
Weekday {
s.Year s.Month s.Day,
4 1 7 4 2 6 4 1 5 3 7 5: e.LeapDoom,
3 7 7 4 2 6 4 1 5 3 7 5: e.NormDoom,
Sunday Monday Tuesday Wednesday Thursday Friday Saturday: e.Days,
<Divmod s.Year 100>: (s.C) s.R,
<Divmod s.R 12>: (s.S) s.T,
<Mod <Add 2 <Mul 5 <Mod s.C 4>>> 7>: s.CAn,
<Mod <Add s.S <Add s.T <Add s.CAn <Div s.T 4>>>> 7>: s.Doom,
<If <LeapYear s.Year> (e.LeapDoom) (e.NormDoom)>: (e.DoomTab),
<Item <Sub s.Month 1> e.DoomTab>: e.Anchor,
<Mod <Add 7 <Sub <Add s.Doom s.Day> e.Anchor>> 7>: s.Weekday
= <Item s.Weekday e.Days>;
};
Item {
0 s.X e.XS = s.X;
s.N s.X e.XS = <Item <Sub s.N 1> e.XS>;
};
If { True t.T t.F = t.T; False t.T t.F = t.F; };
Eq { t.X t.X = True; t.X t.Y = False; };
Or { True s.Y = True; False s.Y = s.Y; };
And { False s.Y = False; True s.Y = s.Y; };
Not { True = False; False = True; };
Neq { t.X t.Y = <Not <Eq t.X t.Y>>; };
Each { (e.F) = ; (e.F) (e.X) e.XS = <Mu e.F e.X> <Each (e.F) e.XS>; };