Ja, es stimmt, unser kalender unterliegt gewissen zyklischen abhängigkeiten, aber ganz so einfach ist es denn doch nicht. Manchmal möchte man im kalender ja auch die festtage ablesen können, und die sind im kristlichen kulturkreis ein bisschen komplizierter als das gewöhnliche spiel mit sonne, mond und wochentagen.
Alle beweglichen feste hängen vom osterdatum ab. Und das osterdatum haben sich ein paar komische käuze im vatikan folgermaßen ausgedacht: es ist der erste sonntag (das ist leicht) nach dem ersten vollmond (nein, nicht mehr ganz so leicht, denn jetzt kommt noch eine kleine erschwerung hinzu) nach dem frühlingsanfang. Frühlingsanfang ist übrigens, wenn die sonne senkrecht übern äkwator steht, dies ist ein wert, der ebenfalls ein bisschen schwanken kann.
Vor einiger zeit war ich einmal mit diesem mist konfrontiert (manchmal watet man eben durch die scheiße, weil man einfache probleme lösen will), konnte beim programmieren nicht ganz so beliebig biblioteken benutzen, wie ich das für mich selbst täte und fand mich darin wieder, die osterformel von Gauß in einer gräußlichen programmiersprache, nämlich in scheme, zu kohden:
; Osterformel
; Gibt für ein Jahr das Datum in Bezug auf den Monat März zurück, dieses
; kann auch über 31 liegen
(define easter-march-date
(lambda (year)
(let*
((intdiv (lambda (n m) (floor (/ n m))))
(k (intdiv year 100))
(m (- (+ 15 (intdiv (* 3 k) 4)) (intdiv (+ (* 8 k) 13) 25)))
(s (- 2 (+ (* k 3) 3)))
(a (modulo year 19))
(d (modulo (+ (* 19 a) m) 30))
(r (+ (intdiv d 29) (* (- (intdiv d 28) (intdiv d 29)) (intdiv a 11))))
(og (- (+ 21 d) r))
(sz (modulo (- 7 (+ year (intdiv year 4) s)) 7))
(oe (- 7 (modulo (- sz og) 7)))
(os (+ oe og)))
os)))
Seitdem ist mein verhältnis zum kalender und zu den terminen der kristlichen feste etwas angespannt. Und ich sage jetzt auch nicht mehr, dass mir die programmiersprache im grunde genommen egal ist, obwohl sie ja eigentlich wirklich egal ist. Aber so manche syntax kitzelt heftig im hirne.
Wer das datum lieber menschenlesbar (und nicht als anzahl tage im märz, also mit der ausgabe 33 für den 2. april) haben möchte, schreibe sich einfach noch eine kleine funkzjon dazu, etwa so eine:
(define easter-string-date
(lambda (year)
(let*
((mdays (easter-march-date year))
(day (cond
((<= mdays 31) mdays)
(else (- mdays 31))))
(mname (cond
((<= mdays 31) "März")
(else "April"))))
(string-append (number->string day) ". " mname " " (number->string year)))))
Und wehe, mir sagt noch einmal jemand, meine perl-kwelltexte wäre unlesbar. 😉
(Man hätte damals lisp an die russen verkaufen sollen, um den kalten krieg ein paar jahrzehnte früher zu beenden. Mir ists übrigens im moment egal, wann ostern ist — hauptsache, der weihnachtliche terror und die ballernden knallköppe zum jahresschluss sind bald vorbei und es wird wieder wärmer draußen.)