Easter
Ian Craigen took a challenge on the ACL User Forum and wrote a script that would identify EASTER every year. Easter is a challenging holiday because it is determined based upon the lunar calendar.
if ftype('batch') <> 'l' DELETE ALL OK
COMMENT
* http://aa.usno.navy.mil/faq/docs/easter.php
* 'NB: "...Easter can never occur before March 22 or later than April 25..."
*
*
* http://www.probabilityof.com/excel.shtml
*
*
* '/* GREGORIAN CALENDAR year > 1583*/
* intCentury = intYear \ 100
* intEpact23 = (intCentury - intCentury \ 4 - (8 * intCentury + 13) \ 25 _ + 19 * intGolden + 15) Mod 30
* intPFmoon = intEpact23 - (intEpact23 \ 28) _ * (1 - (29 \ (intEpact23 + 1)) * ((21 - intGolden) \ 11))
* intPFmoonWeekday = (intYear + (intYear \ 4) + intPFmoon + 2 _ - intCentury + (intCentury \ 4)) Mod 7
* intPFmoonSunday = intPFmoon - intPFmoonWeekday
* intEasterMonth = 3 + ((intPFmoonSunday + 40) \ 44)
* intEasterDay = intPFmoonSunday + 28 - 31 * (intEasterMonth \ 4)
* EasterDateCalendarFAQ = DateSerial(intYear, intEasterMonth, intEasterDay)
*
END
if ftype('batch') <> 'l' ACCEPT "Enter year as an integer" TO year
if ftype('year') = 'c' intyear = value(year,0)
if ftype('year') = 'n' intyear = INT(year)
intcentury = int(intyear / 100.000)
intGolden = int(mod(intYear,19.000))
intEpact23 = int(mod(intcentury - int(intcentury/4.000)-int(( 8 * intcentury + 13)/25.000)+19*intGolden+15,30))
intPFmoon = int(intEpact23 - int(intEpact23 / 28.000) * (1 - int(29.000 / (intEpact23 + 1)) * int((21 - intGolden)/ 11.000)) )
intPFmoonWeekday = int(mod((intYear + int(intYear / 4.000) + intPFmoon + 2 - intCentury + int(intCentury / 4.000)),7 ))
intPFmoonSunday = intPFmoon - intPFmoonWeekday
intEasterMonth = int(3 + int((intPFmoonSunday + 40) / 44.000) )
intEasterDay = int(intPFmoonSunday + 28 - 31 * int(intEasterMonth / 4.000) )
Easteryear = zoned(intyear,4)
Eastermonth = zoned(intEasterMonth,2)
Easterday = zoned(intEasterDay,2)
EasterDate = Date(`%Easteryear%%EasterMonth%%EasterDay%`)
if ftype('batch') = 'l' EXTRACT EasterDate to Easterdates APPEND FIRST 1
if ftype('batch') <> 'l' DIALOG (DIALOG TITLE "User Dialog" WIDTH 459 HEIGHT 159 ) (BUTTONSET TITLE "&OK;&Cancel" AT 370 12 DEFAULT 1 ) (TEXT TITLE "Easter is %Easterdate%" AT 12 16 WIDTH 258 )