Here's my code for Ting's 4/24 programmer's challenge. I've included the Forth version, as well as a Python version which I used to convince myself I had a plausible solution. The Python version is of course longer, slower, and uses floating point. -Brad Nelson bnels123@gmail.com ---------- 365256363 constant year 29530689 constant month 1000000 constant day : >date ( m d y -- dd ) year * swap 1- day * + swap 1- month * + ; : date> ( dd -- m d y ) year /mod >r month /mod 1+ swap day / 1+ r> ; : date. ( dd -- ) date> >r >r s>d <# # # #> type ." /" r> s>d <# # # #> type ." /" r> s>d <# # # # # #> type ; : skew ( n period -- n ) mod day / ; : aligns? ( a b period -- f ) dup >r skew swap r> skew = ; : spring-equinox? 3 21 2010 >date year aligns? ; : full-moon? 3 29 2010 >date month aligns? ; : thursday? 3 25 2010 >date 7 day * aligns? ; : yesterday ( dd -- dd ) day - ; : ??true ( T -- 1 break ) if drop 1 rdrop then ; : ??false ( F -- 0 break ) if drop 0 rdrop then ; : passover? ( dd -- f) dup full-moon? 0= ??false begin yesterday dup spring-equinox? ??true dup full-moon? ??false again ; : target? ( dd -- f) yesterday dup passover? swap thursday? and ; : check ( dd -- ) dup target? if date. cr else drop then ; : solve 20000 1000 do i day * check loop ; solve bye ------- #!/usr/bin/python YEAR = 365.256363 MONTH = 29.530689 def DateToDay(month, day, year): return year * YEAR + (month - 1) * MONTH + (day - 1) def DayToDate(day): year = int(day / YEAR) day -= year * YEAR month = int(day/ MONTH) day -= month * MONTH return ((month + 1), int(day + 1), year) def Aligns(a, b, interval): return int(a % interval) == int(b % interval) def IsSpringEquinox(day): return Aligns(DateToDay(3, 21, 2010), day, YEAR) def IsFullMoon(day): return Aligns(DateToDay(3, 29, 2010), day, MONTH) def IsThursday(day): return Aligns(DateToDay(3, 25, 2010), day, 7) def DayToWeekday(day): wd = int(day % 7) return ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')[wd] def IsPassover(day): if not IsFullMoon(day): return False while True: day -= 1 if IsSpringEquinox(day): return True if IsFullMoon(day): return False def IsTarget(day): return IsPassover(day - 1) and IsThursday(day - 1) for x in range(1000, 20000): if IsTarget(x): print '%02d/%02d/%04d' % DayToDate(x), DayToWeekday(x)