[Allegro] Hommage a C.F. Gauss: Ein Oster-FLEX

B.Eversberg ev at biblio.tu-bs.de
Fr Mär 4 08:44:35 CET 2005


Hommage à C.F. Gauß: ein Oster-FLEX (kostenlos)

Auf welchen Wochentag in einem gegebenen Jahr das Osterfest fällt und auf
welches Datum der Heiligabend - wer wüßte das nicht sofort zu sagen.
Wesentlich schwerer tun sich die meisten mit den umgekehrten Fragen.
Zwar ist das mit dem Frühlingsvollmond ja nicht so schwer zu merken,
aber vorauszusagen, wann der denn erscheinen wird, das ist die Kunst.
Einer, der sowas leicht schaffte, war Carl Friedrich Gauß. Seiner gilt es
in diesem Jahr zu gedenken, starb er doch am 23. Februar 1855, also vor
150 Jahren, und steht er doch als Braunschweigs zweitgrößter Sohn, gleich
hinter Heinrich dem Löwen, bis heute in höchstem Ansehen, wie das Lokalblatt
vor kurzem in einem Ranking herausfand.
Zu seinen Glanztaten als mathematischer Dickbrettbohrer gehört die
Formulierung eines Algorithmus, mit dem das Osterdatum berechnet werden 
kann,
jedenfalls für die Jahre 1700 bis 2199. Noch heute und noch lange können wir
davon profitieren. Damit sind wir bei FLEX!
Was eine rechte Programmiersprache sein will, in der möchte sich wohl
Gaußens Osterformel ausdrücken lassen. Und so gedachten wir
einen Wettbewerb auszuschreiben, zusammen mit der Göttinger Akademie,
wer denn die eleganteste Implementierung in FLEX zuwege brächte.
Höchst ungleich wären aber die Chancen der potentiellen Teilnehmer
gewesen, liegen doch deren FLEX-Fertigkeiten weit auseinander. Also
haben wir's mal fix selber gemacht. Weiter unten ist's abgedruckt, fertig
zum Abkupfern und überhaupt als Exempel fürs Rechnen mit FLEX.

Einmal dabei, fiel uns aber peinlich auf, daß wir für eine den Namen 
verdienende
DATENverarbeitung, verstanden als Verarbeitung von DATUMsangaben, in FLEX
doch noch unvollkommenes Rüstzeug besitzen. Der Wochentag des Christfestes
in einem gegebenen Jahr beispielsweise läßt sich damit nicht dingfest 
machen!
Wobei dazu selbst Gauß nichts hinterlassen hat - war ihm wohl zu trivial.

Man braucht, kurz und gut, auch noch eine Funktion, die einem den Wochentag
verrät, wenn man ihr ein Datum der Form  JJJJMMTT  übergibt. Weihnachten
wäre damit genauso zu erledigen wie jedes andere feste Datum (nicht nur
Festdatum!) des Jahres, etwa der Erste Mai, der 14.7., Allerheiligen, oder
der Reformationstag. Eine oekumenische Funktion, na klar.

Aber noch drei Sachen sind vonnöten, wenn man etwa an Ausleihrückgabetermin-
versäumnisberechnungen und Lieferfristüberschreitungsermittlungen denkt 
- was
wir in der Entwicklung neuer aLF- und ORDER-Funktionen ja tun müssen.
Die Aufgaben sind diese:

1. Wieviele Tage liegen zwischen Datum 1 und Datum 2 (beide angegeben in der
    Form JJJJMMTT, wie sie in allegro-Dateien immer vorliegen)?

2. Welches Datum schreibt man X Tage nach oder vor JJJJMMTT? Damit hat man,
    kann man erst Ostern ausrechnen, auch Himmelfahrt im Griff, auch 
Pfingsten
    und sämtliche Sonntage nach Pfingsten etc.! (Denn Himmelfahrt ist ja
    Ostern +39, Pfingsten ist Himmelfahrt +10, Trinitatis=Pfingsten +7,
    Aschermittwoch=Ostern -45 ...)

3. Welches Datum haben wir 20 Arbeitstage(!) von heute? [Falls man 
Fristen in
    Öffnungstagen bemessen will und nicht in Kalendertagen!]

Nummer 3 ist am schwersten, denn es setzt voraus, daß man irgendeine Art
von Liste der Arbeits- oder Öffnungstage hat. Mit den bisherigen 
Kalendersätzen
haben wir die, sie müssen nur für FLEX handhabbar gemacht werden.

Hat man alles dieses, kann man sogar die Daten der Adventssonntage 
berechnen.
Der Leser / die Leserin überlege sich das als Übungsaufgabe.

Es kann heute vermeldet werden, daß diese Einzelprobleme samt und sonders
gelöst sind.
Wer eine Lizenz für aLF und/oder ORDER besitzt, wird schon vorfristig in den
Genuß kommen! Alle anderen müssen bis zur V25.5 warten, der nächsten
offiziellen Version im Mai. Dafür wird's dann einen Feiertags-Berechnungs-
FLEX geben, der keine Wünsche mehr offen läßt - öffentliche Enthüllung
auf dem Expertentreffen!!

Nachdem dies alles geschafft war, wollten wir gerade zum Frohlocken anheben,
als uns auffiel: Die geballte FLEX-Power kann EINE Frage noch immer NICHT
beantworten: Auf welches Datum fällt dieses Jahr der Heiligabend? Bedrückend
deutlich zeigt sich hier, welch tiefe Kluft noch immer klafft zwischen
natürlicher und künstlicher Intelligenz...

ANHANG
Hier die versprochene Gauß-Vorschrift in FLEX:
Kopieren Sie zum Ausprobieren das Ganze (unterhalb des Striches) in eine 
Datei
namens  gauss.flx und dann einfach eingeben:  X gauss
(Lauffaehig mit V25.2!)
Die Formel selbst kann man z.B. hier nachschlagen (am Ende der Seite):
http://www.uni-bamberg.de/ktheo/liturgie/@fkal.html
Und ein hoechst umfaengliches Tabellenwerk aller, freilich nur katholischen,
Fest-, Feier- und Gedenktage wird bei den Salesianern vorgehalten:
http://www.salesianer.de/util/liturkal.html


C.F. Gauß, er lebe hoch! B.E.

----------------------------------------------------------------------------------

   GAUSS.FLX : Berechnung des Osterdatums nach dem Gauss-Algorithmus
   2005-02-25

   Jahr abfragen. Eingabe steht dann in iV
ask Jahr?
if "" end
   Unterprogramm ausfuehren
perf gauss

   Antwort steht in der iV, mit ins #uxy kann man sie speichern!
   hier wird sie nur angezeigt:
mes
end

   *****
   Dieses Unterprogramm kann man anhaengen an jeden eigenen FLEX
   Aufruf erfolgt mit "perf gauss", wobei Jahreszahl in der iV steht
   Hilfsvariable: #uAX und #uEX, werden alle wieder geloescht
   Antwort kommt in iV zurueck, die Form sieht man beim Ausprobieren.
:gauss
ins #uAj
if <1700 jump Error
if >2199 jump Error
if "17" var "23";ins #uEM;var "3";ins #uEN;jump Eb
if "18" var "23";ins #uEM;var "4";ins #uEN;jump Eb
if "19" var "24";ins #uEM;var "5";ins #uEN;jump Eb
if "20" var "24";ins #uEM;var "5";ins #uEN;jump Eb
if "21" var "24";ins #uEM;var "6";ins #uEN;jump Eb
   ungueltige Eingabe
:Error
var "Sorry, das Jahr " #uAj " liegt nicht im Bereich von 1700 bis 2199"
#uAj
return

   Hier geht die Berechnung los
:Eb
var #uAj
z=
z%19
var z
ins #uEA

var #uAj
z=
z%4
var z
ins #uEB

var #uAj
z=
z%7
var z
ins #uEC

var #uEA
z=
z*19
var #uEM
z+
z%30
var z
ins #uED

var #uEB
z=
z*2
var #uEC
Z=
Z*4
var Z
z+
var #uED
Z=
Z*6
var Z
z+
var #uEN
z+
z%7
var z
ins #uEE

var "3"
ins #uAm

var "22"
z=
var #uED
z+
var #uEE
z+
var z
ins #uAt

var #uAt
if <32 jump Ende

z=
z-31
var z
ins #uAt
var "4"
ins #uAm

var #uAt
if ="26" var "19"; ins #uAt
var #uAt
if not ="25" jump Ende
var #uED
if not ="28" jump Ende
var #uEA
if not >"10" jump Ende
var "18"
ins #uAt


:Ende
   Die Normalform JJJJMMTT zusammensetzen:
var #uAj #uAm(0,r2) #uAt(0,r2)
ins _ _0_
   und in #uAd hinterlegen
ins #uAd

#uAwwird
var #dts(0,4)
if >#uAj var "wurde";ins #uAw
   Antwort zusammenstellen
var "Im Jahre " #uAj " " #uAw " Ostern am " #uAt "." #uAm " gefeiert. (" 
#uAd ")"

  Hilfsvar. beseitigen
#uE~
#uA~

return





Mehr Informationen über die Mailingliste Allegro