[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