Holidays related to Easter: Difference between revisions
m (→[[Holidays_related_to_Easter#ALGOL 68]]: spelling.) |
m (→[[Holidays_related_to_Easter#ALGOL 68]]: accelerate date +:= days OPerator to handle stepping back AND forward in time. (There is probably a non looping formular for this?)) |
||
Line 10: | Line 10: | ||
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}} |
||
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}} |
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}} |
||
Note: |
Note: Base code specimen extracted from [http://www.xs4all.nl/~jmvdveer/a68g-doc.pdf Algol 68 Genie Documentation] Part III - ''Example a68g programs.'' |
||
<!-- |
<!-- |
||
Part I, II, III and V are distributed under the conditions of the GNU Free Documentation |
Part I, II, III and V are distributed under the conditions of the GNU Free Documentation |
||
Line 20: | Line 20: | ||
MODE DATE = STRUCT( |
MODE DATE = STRUCT( |
||
YEAR year, #DAY year day, # |
YEAR year, #DAY year day, # |
||
MONTH month, DAY month day,# |
MONTH month, DAY month day,# |
||
WEEK week, #DAY week day); |
WEEK week, #DAY week day); |
||
FORMAT mon fmt = |
FORMAT mon fmt = $c("Jan", "Feb", "Mar", "Apr", "May", "Jun", |
||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")$, |
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")$, |
||
FORMAT week day fmt = $c("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri")$; |
FORMAT week day fmt = $c("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri")$; |
||
PROC year days = (YEAR year)DAY: # Ignore 1752 for the moment # |
PROC year days = (YEAR year)DAY: # Ignore 1752 CE for the moment # |
||
( month days(year, 2) = 28 | 365 | 366 ); |
( month days(year, 2) = 28 | 365 | 366 ); |
||
Line 40: | Line 40: | ||
OP + = (DATE in date, DAY in days)DATE: |
OP + = (DATE in date, DAY in days)DATE: |
||
BEGIN # todo: eliminate loops, handle year <= 1752 # |
|||
BEGIN |
|||
DAY days := in days; |
DAY days := in days; |
||
DATE date := in date; |
DATE date := in date; |
||
# Normalize the days to be less then 1 year # |
|||
WHILE days < 0 DO |
WHILE days < 0 DO |
||
year OF date -:= 1; |
year OF date -:= 1; |
||
days +:= year days(year OF date) |
days +:= year days(year OF date) |
||
OD; |
OD; |
||
WHILE days > year days(year OF date) DO |
|||
days -:= year days(year OF date); |
|||
year OF date +:= 1 |
|||
⚫ | |||
month day OF date +:= days; |
|||
# Normalize the days to be the same month # |
|||
WHILE month day OF date > month days(year OF date, month OF date) DO |
WHILE month day OF date > month days(year OF date, month OF date) DO |
||
month day OF date -:= month days(year OF date, month OF date); |
month day OF date -:= month days(year OF date, month OF date); |
||
Line 113: | Line 119: | ||
END; |
END; |
||
# Note: Y10K bug here... :-) # |
|||
FORMAT easter related fmt = $ |
FORMAT easter related fmt = $g(-2)" Easter: "f(wdmdm fmt) ", Ascension: "f(wdmdm fmt) |
||
", Pentecost: "f(wdmdm fmt) ", Trinity: "f(wdmdm fmt)", Corpus: "f(wdmdm fmt)$; |
", Pentecost: "f(wdmdm fmt) ", Trinity: "f(wdmdm fmt)", Corpus: "f(wdmdm fmt)$; |
||
Line 121: | Line 128: | ||
PROC wdmdm = (DATE date)STRUCT(DAY week day, DAY month day, MONTH month): |
PROC wdmdm = (DATE date)STRUCT(DAY week day, DAY month day, MONTH month): |
||
(week day OF date, month day OF date, month OF date); |
(week day OF date, month day OF date, month OF date); |
||
printf((easter related fmt, |
printf((easter related fmt, year, |
||
wdmdm(easter OF holidays), wdmdm(ascension OF holidays), wdmdm(pentecost OF holidays), |
|||
⚫ | |||
wdmdm( |
wdmdm(trinity OF holidays), wdmdm(corpus christi OF holidays), |
||
wdmdm(ascension OF holidays), |
|||
wdmdm(pentecost OF holidays), |
|||
wdmdm(trinity OF holidays), |
|||
wdmdm(corpus christi OF holidays), |
|||
$l$)) |
$l$)) |
||
END; |
END; |
||
printf (($"Christian holidays, related to Easter, for each |
printf (($"Christian holidays, related to Easter, for each centennial from 400 to 2100 CE:"l$)); |
||
FOR year FROM 400 BY 100 TO 2100 DO easter related print(year) OD; |
FOR year FROM 400 BY 100 TO 2100 DO easter related print(year) OD; |
||
printf (($l"Christian holidays, related to Easter, for years from 2010 to 2020:"l$)); |
printf (($l"Christian holidays, related to Easter, for years from 2010 to 2020 CE:"l$)); |
||
FOR year FROM 2010 TO 2020 DO easter related print(year) OD</lang> |
FOR year FROM 2010 TO 2020 DO easter related print(year) OD</lang> |
||
Output: |
Output: |
||
<pre> |
<pre> |
||
Christian holidays, related to Easter, for each |
Christian holidays, related to Easter, for each centennial from 400 to 2100 CE: |
||
** Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun |
|||
** Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun |
|||
** Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun |
|||
** Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun |
|||
** Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun |
|||
** Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May |
|||
** Easter: Sun 30 Mar, Ascension: Thu 8 May, Pentecost: Sun 18 May, Trinity: Sun 25 May, Corpus: Thu 29 May |
|||
** Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun |
|||
** Easter: Sun 9 Apr, Ascension: Thu 18 May, Pentecost: Sun 28 May, Trinity: Sun 4 Jun, Corpus: Thu 8 Jun |
|||
** Easter: Sun 18 Apr, Ascension: Thu 27 May, Pentecost: Sun 6 Jun, Trinity: Sun 13 Jun, Corpus: Thu 17 Jun |
|||
** Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun |
|||
** Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May |
|||
** Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun |
|||
** Easter: Sun 11 Apr, Ascension: Thu 20 May, Pentecost: Sun 30 May, Trinity: Sun 6 Jun, Corpus: Thu 10 Jun |
|||
** Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun |
|||
** Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun |
|||
** Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun |
|||
** Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May |
|||
Christian holidays, related to Easter, for years from 2010 to 2020: |
Christian holidays, related to Easter, for years from 2010 to 2020 CE: |
||
** Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun |
|||
** Easter: Sun 24 Apr, Ascension: Thu 2 Jun, Pentecost: Sun 12 Jun, Trinity: Sun 19 Jun, Corpus: Thu 23 Jun |
|||
** Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun |
|||
** Easter: Sun 31 Mar, Ascension: Thu 9 May, Pentecost: Sun 19 May, Trinity: Sun 26 May, Corpus: Thu 30 May |
|||
** Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun |
|||
** Easter: Sun 5 Apr, Ascension: Thu 14 May, Pentecost: Sun 24 May, Trinity: Sun 31 May, Corpus: Thu 4 Jun |
|||
** Easter: Sun 27 Mar, Ascension: Thu 5 May, Pentecost: Sun 15 May, Trinity: Sun 22 May, Corpus: Thu 26 May |
|||
** Easter: Sun 16 Apr, Ascension: Thu 25 May, Pentecost: Sun 4 Jun, Trinity: Sun 11 Jun, Corpus: Thu 15 Jun |
|||
** Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May |
|||
** Easter: Sun 21 Apr, Ascension: Thu 30 May, Pentecost: Sun 9 Jun, Trinity: Sun 16 Jun, Corpus: Thu 20 Jun |
|||
** Easter: Sun 12 Apr, Ascension: Thu 21 May, Pentecost: Sun 31 May, Trinity: Sun 7 Jun, Corpus: Thu 11 Jun |
|||
</pre> |
</pre> |
Revision as of 04:23, 29 June 2010
You are encouraged to solve this task according to the task description, using any language you may know.
Calculate the date of Easter, Ascension Thursday, Pentecost, Trinity Sunday & Corpus Christi feast.
As the example calculate for the first year of each century from 400 to 2100 CE and also for years 2010 to 2020 CE.
Note: From year 325 CE on, Easter Sunday is the Sunday following the first Ecclesiastical full moon not earlier than the equinox date in 325 — 21 March. The Ecclesiastical full moon does not always correspond to the astronomical full moon since in 325 fine details of Lunar dynamics were not yet fully understood.
ALGOL 68
Note: Base code specimen extracted from Algol 68 Genie Documentation Part III - Example a68g programs. <lang algol68>MODE YEAR = INT, MONTH = INT, WEEK = INT, DAY = INT;
MODE DATE = STRUCT(
YEAR year, #DAY year day, # MONTH month, DAY month day,# WEEK week, #DAY week day);
FORMAT mon fmt = $c("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec")$,
FORMAT week day fmt = $c("Sat", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri")$;
PROC year days = (YEAR year)DAY: # Ignore 1752 CE for the moment #
( month days(year, 2) = 28 | 365 | 366 );
PROC month days = (YEAR year, MONTH month) INT:
( month | 31, 28 + ABS(year MOD 4 NE 0 OR year MOD 400 EQ 0), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
INT year months = 12; INT week days = 7; # France 1793 to 1805 had 10 day weeks! #
OP + = (DATE in date, DAY in days)DATE:
BEGIN # todo: eliminate loops, handle year <= 1752 # DAY days := in days; DATE date := in date; # Normalize the days to be less then 1 year # WHILE days < 0 DO year OF date -:= 1; days +:= year days(year OF date) OD; WHILE days > year days(year OF date) DO days -:= year days(year OF date); year OF date +:= 1 OD; month day OF date +:= days; # Normalize the days to be the same month # WHILE month day OF date > month days(year OF date, month OF date) DO month day OF date -:= month days(year OF date, month OF date); month OF date +:= 1; IF month OF date > year months THEN month OF date -:= year months; year OF date +:= 1 FI OD; week day OF date := week day(date); date END;
OP +:= = (REF DATE date, DAY in days)DATE:
date := date + in days;
PROC easter = (YEAR year)DATE:
BEGIN COMMENT Easter date algorithm from J.M. Oudin (1940), reprinted in: P.K. Seidelmann ed., "Explanatory Supplement to the Astronomical Almanac" [1992] (Chapter 12, "Calendars", by L.E. Doggett) COMMENT DATE date; year OF date := year; INT c = year % 100, n = year %* 19; INT i := (c - c % 4 - (c - (c - 17) % 25) % 3 + 19 * n + 15) %* 30; i -:= (i % 28) * (1 - (i % 28) * (29 % (i + 1)) * ((21 - n) % 11)); INT l = i - (year + year % 4 + i + 2 - c + c % 4) %* 7; month OF date := 3 + (l + 40) % 44; month day OF date := l + 28 - 31 * (month OF date % 4); week day OF date := week day(date); date END;
PROC week day = (DATE date)DAY:
# Zeller’s Congruence algorithm from 1887. # BEGIN INT year := year OF date, month := month OF date, month day := month day OF date, c; (month <= 2 | (month +:= 12, year -:= 1)); c := year OVER 100; year %*:= 100; 1 + (month day + ((month + 1) * 26) OVER 10 + year + year OVER 4 + c OVER 4 - 2 * c) %* 7 END;
FORMAT wdmdm fmt = $f(week day fmt)z-dxf(mon fmt)$,
MODE EASTERRELATED = STRUCT(DATE easter, ascension, pentecost, trinity, corpus christi);
PROC easter related init = (YEAR year)EASTERRELATED: BEGIN
DATE date; EASTERRELATED holidays;
- Easter date, always a Sunday. #
easter OF holidays := date := easter(year);
- Ascension day is 39 days after Easter.#
ascension OF holidays := ( date +:= 39);
- Pentecost is 10 days after Ascension day.#
pentecost OF holidays := date +:= 10;
- Trinity is 7 days after Pentecost.#
trinity OF holidays := date +:= 7;
- Corpus Christi is 4 days after Trinity.#
corpus christi OF holidays := date +:= 4; holidays
END;
- Note: Y10K bug here... :-) #
FORMAT easter related fmt = $g(-2)" Easter: "f(wdmdm fmt) ", Ascension: "f(wdmdm fmt)
", Pentecost: "f(wdmdm fmt) ", Trinity: "f(wdmdm fmt)", Corpus: "f(wdmdm fmt)$;
PROC easter related print = (YEAR year)VOID: BEGIN
EASTERRELATED holidays = easter related init(year); PROC wdmdm = (DATE date)STRUCT(DAY week day, DAY month day, MONTH month): (week day OF date, month day OF date, month OF date); printf((easter related fmt, year, wdmdm(easter OF holidays), wdmdm(ascension OF holidays), wdmdm(pentecost OF holidays), wdmdm(trinity OF holidays), wdmdm(corpus christi OF holidays), $l$))
END;
printf (($"Christian holidays, related to Easter, for each centennial from 400 to 2100 CE:"l$)); FOR year FROM 400 BY 100 TO 2100 DO easter related print(year) OD;
printf (($l"Christian holidays, related to Easter, for years from 2010 to 2020 CE:"l$)); FOR year FROM 2010 TO 2020 DO easter related print(year) OD</lang> Output:
Christian holidays, related to Easter, for each centennial from 400 to 2100 CE: ** Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun ** Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun ** Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun ** Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun ** Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun ** Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May ** Easter: Sun 30 Mar, Ascension: Thu 8 May, Pentecost: Sun 18 May, Trinity: Sun 25 May, Corpus: Thu 29 May ** Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun ** Easter: Sun 9 Apr, Ascension: Thu 18 May, Pentecost: Sun 28 May, Trinity: Sun 4 Jun, Corpus: Thu 8 Jun ** Easter: Sun 18 Apr, Ascension: Thu 27 May, Pentecost: Sun 6 Jun, Trinity: Sun 13 Jun, Corpus: Thu 17 Jun ** Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun ** Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May ** Easter: Sun 2 Apr, Ascension: Thu 11 May, Pentecost: Sun 21 May, Trinity: Sun 28 May, Corpus: Thu 1 Jun ** Easter: Sun 11 Apr, Ascension: Thu 20 May, Pentecost: Sun 30 May, Trinity: Sun 6 Jun, Corpus: Thu 10 Jun ** Easter: Sun 13 Apr, Ascension: Thu 22 May, Pentecost: Sun 1 Jun, Trinity: Sun 8 Jun, Corpus: Thu 12 Jun ** Easter: Sun 15 Apr, Ascension: Thu 24 May, Pentecost: Sun 3 Jun, Trinity: Sun 10 Jun, Corpus: Thu 14 Jun ** Easter: Sun 23 Apr, Ascension: Thu 1 Jun, Pentecost: Sun 11 Jun, Trinity: Sun 18 Jun, Corpus: Thu 22 Jun ** Easter: Sun 28 Mar, Ascension: Thu 6 May, Pentecost: Sun 16 May, Trinity: Sun 23 May, Corpus: Thu 27 May Christian holidays, related to Easter, for years from 2010 to 2020 CE: ** Easter: Sun 4 Apr, Ascension: Thu 13 May, Pentecost: Sun 23 May, Trinity: Sun 30 May, Corpus: Thu 3 Jun ** Easter: Sun 24 Apr, Ascension: Thu 2 Jun, Pentecost: Sun 12 Jun, Trinity: Sun 19 Jun, Corpus: Thu 23 Jun ** Easter: Sun 8 Apr, Ascension: Thu 17 May, Pentecost: Sun 27 May, Trinity: Sun 3 Jun, Corpus: Thu 7 Jun ** Easter: Sun 31 Mar, Ascension: Thu 9 May, Pentecost: Sun 19 May, Trinity: Sun 26 May, Corpus: Thu 30 May ** Easter: Sun 20 Apr, Ascension: Thu 29 May, Pentecost: Sun 8 Jun, Trinity: Sun 15 Jun, Corpus: Thu 19 Jun ** Easter: Sun 5 Apr, Ascension: Thu 14 May, Pentecost: Sun 24 May, Trinity: Sun 31 May, Corpus: Thu 4 Jun ** Easter: Sun 27 Mar, Ascension: Thu 5 May, Pentecost: Sun 15 May, Trinity: Sun 22 May, Corpus: Thu 26 May ** Easter: Sun 16 Apr, Ascension: Thu 25 May, Pentecost: Sun 4 Jun, Trinity: Sun 11 Jun, Corpus: Thu 15 Jun ** Easter: Sun 1 Apr, Ascension: Thu 10 May, Pentecost: Sun 20 May, Trinity: Sun 27 May, Corpus: Thu 31 May ** Easter: Sun 21 Apr, Ascension: Thu 30 May, Pentecost: Sun 9 Jun, Trinity: Sun 16 Jun, Corpus: Thu 20 Jun ** Easter: Sun 12 Apr, Ascension: Thu 21 May, Pentecost: Sun 31 May, Trinity: Sun 7 Jun, Corpus: Thu 11 Jun