Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Kopfrechnen im Julianischen Kalender (https://www.delphipraxis.net/187852-kopfrechnen-im-julianischen-kalender.html)

Wolfgang Mix 8. Jan 2016 20:50


Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
Schade, dass der Beitrag von mathematiker mit dem Beitrag „Mathematik alpha“ am Ende OT wurde.
Ich jedenfalls habe davon profitiert, denn mit seiner privaten Unterstützung und der von Gert Mittring ist es mir gelungen,
einen Algorithmus zu basteln, mit dem man auch mit julianischen Datumsangaben in angemessener Zeit Kopfrechnen kann (ohne Internet und Taschenrechner).

Obwohl keine Disziplin bei Weltmeisterschaften oder Olympiaden für Kopfrechnen,
ist diese zumindest genauso spannend und gut für Gedächtnistraining wie das Lösen schwerer oder teuflischer Sudoku.

Wer weiterlesen und üben möchte, fängt an, die im Anhang geprüften Daten schriftlich zu üben.
Nach ein paar Übungen geht es dann auch im Kopf.

Ich habe mich bemüht, das Thema auf 2 Seiten DIN A4 einigermassen begreiflich darzustellen.
Das Rechnen mit ganzen Zahlen (Rechnen mit DIV und MOD) sollte bekannt sein.
Zudem ist das auch eine nette Übungsaufgabe für Hobby-Codierer, Programmiersprache egal.
Die Zeller-Formel scheidet aus, ebenso die von Jacobsthal, weil die Einzeltherme zu grosse ganze Zahlen ergeben, zur Überprüfung aber ideal und Standard.

Auf Schreib- und Grammatikfehler möchte ich hingewiesen werden, der Anhang wird dann entsprechend geändert.

Kritik ist erwünscht

SProske 8. Jan 2016 21:37

AW: Kopfrechnen im Julianischen Kalender
 
Kann es sein, dass die angehängte PDF nochmals deinen Beitrag enthält? Oder läuft bei mir nur gerade irgendetwas sehr seltsam?

Aviator 8. Jan 2016 21:40

AW: Kopfrechnen im Julianischen Kalender
 
Zitat:

Zitat von SProske (Beitrag 1326451)
Kann es sein, dass die angehängte PDF nochmals deinen Beitrag enthält? Oder läuft bei mir nur gerade irgendetwas sehr seltsam?

Nö dem ist leider so. Irgendwie wohl die falsche Datei erwischt.

Wolfgang Mix 8. Jan 2016 22:16

AW: Kopfrechnen im Julianischen Kalender
 
Entschuldigung, ihr habt Recht.
Habe mich verklickt.
Jetzt sollte es klappen.

nahpets 9. Jan 2016 13:08

AW: Kopfrechnen im Julianischen Kalender
 
Zitat:

Zitat von Wolfgang Mix (Beitrag 1326449)
Auf Schreib- und Grammatikfehler möchte ich hingewiesen werden, der Anhang wird dann entsprechend geändert.

Hallo Wolfgang!

Schönen Dank für die nette "Rechenanleitung".

Da die Zahl meiner Anmerkungen doch etwas mehr wäre, als für eine Beschreibung im Thread sinnvoll wäre, erlaube ich mir, eine überarbeitete PDF-Datei hier anzuhängen.

(Ebenso als Word-Dokument, damit Du es ggfls. weiter bearbeiten kannst.)
(Anderes Format gewünscht? Alles was OpenOffice kann.)

Wolfgang Mix 9. Jan 2016 15:04

AW: Kopfrechnen im Julianischen Kalender
 
Hallo Stephan,

Danke für das aufmerksame Lesen und deine Mühe. Im 1. Beispiel ist die Monatskennziffer 4, nicht etwa wegen des 4. Monats im Jahr.
( Januar 5 .. Dezember 3, sh. k-Werte weiter oben 511 462 405 513).
Das Monatskennziffer 4 und Monatszahl auch 4 ist, ist Zufall. Eventuell ist es für das 1. Beispiel besser. einen anderen Monat zu wählen.
Es wäre nett, wenn du das in deinen angehängten Dokumenten änderst, damit keine Verwirrung aufkommt.

PS: Dein Origin finde ich gut :-)

Wolfgang

nahpets 9. Jan 2016 16:03

AW: Kopfrechnen im Julianischen Kalender
 
Mir ist hier noch was Klammertechnisches aufgefallen:

Delphi-Quellcode:
wt = (( t (mod 7) + k + jz div 12 + jz mod 12 + (jz mod 12) div 4 - jh mod ) mod 7
Das passt irgendwie nicht, hinter dem zweiten mod von rechts fehlt irgendwie 'ne Zahl oder das mod ist zuviel.
Außerdem hat die Formel 4 öffnende, aber nur drei schließende Klammern, die dritte öffnende Klammer erscheint mir fehl am Platz.

Könntest Du da bitte nochmal draufschauen, bevor ich das ändere?

Du kannst aber auch "meine" PDF-Datei in Deinen ersten Post hängen, ich würde die bei mir dann löschen.

Wolfgang Mix 9. Jan 2016 18:43

AW: Kopfrechnen im Julianischen Kalender
 
Danke Stephan,

du hast vollkommen Recht.
Ich habe jetzt die äusseren Klammern durch eckige ersetzt.
Sieht auch optisch überschaubarer aus. Beim vorletzten mod fehlte 7.
War Fummelei auf meiner Mac-Tastatur und Pages statt MS Word, weil eckige Klammern
nur über Shortcuts zu erreichen sind (Alt+5 und Alt+6 war die Lösung).

Das PDF in Post 1 habe ich ersetzt.

Wolfgang Mix 10. Jan 2016 18:44

AW: Kopfrechnen im Julianischen Kalender
 
Liebe DP-Gemeinde,

da ich meinen Post1 wegen abgelaufener 14400 Minuten nicht mehr updaten kann,
meinen Dank noch einmal an meine Helfer.
Wer sie bisher nicht kannte, findet z.B. in folgenden Links Informationen.

Steffen Polster alias mathematiker hier bei DP
Winfunktion ( Jetzt Mathematik alpha kostenlos und fast täglich aktualisiert)
http://www.heise.de/download/winfunk...s-1186485.html
http://mathematikalpha.de

Gert Mittring
http://www.fischerverlage.de/buch/Re.../9783596189892

Mathematiker 14. Jan 2016 13:45

AW: Kopfrechnen im Julianischen Kalender
 
Hallo,
der Algorithmus von Wolfgang ist sehr interessant und in seiner Art neu. Für den julianischen Kalender kannte ich so etwas noch nicht. Auch im Netz habe ich nichts gefunden.

Deshalb meine Bitte: Könnten die Moderatoren den Thread in den Bereich Algorithmen verschieben. Da gehört das Thema eher hin, bevor es von den vielen "Klatsch und Tratsch"-Geschichten, die alle wichtig sind, "verdeckt" wird.

Danke
Mathematiker

DP-Maintenance 16. Jan 2016 09:43

Dieses Thema wurde am "16. Jan 2016, 10:43 Uhr" von "Daniel" aus dem Forum "Klatsch und Tratsch" in das Forum "Algorithmen, Datenstrukturen und Klassendesign" verschoben.

Wolfgang Mix 20. Jan 2016 17:12

AW: Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
@daniel & mathematiker

Danke an beide!

Ich schiebe jetzt im Anhang noch eine Kurzanleitung hinterher.
Vielleicht kann einer der Moderaten den noch in Post 1 dranhängen.

Danke

Amateurprofi 21. Jan 2016 13:04

AW: Kopfrechnen im Julianischen Kalender
 
@Wolfgang:
Na, da hast du dich ja mächtig ins Zeug gelegt.
Hast du eigentlich mal kontrolliert, ob das auch funktioniert.
Das Verfahren liefert falsche Ergebnisse
1) für 07.08, 14.08, 21.08 und 28.08 in den Jahren 0600 und 1300.
2) für alle Tage im September in allen Jahren.
Fehler 1 lässt sich beheben, indem man bei der Addition der Zahlen noch 7 hinzu addiert.
Fehler 2 lässt sich beheben, indem man als Kennziffer für September 3 (statt 5) verwendet.

Im übrigen verwende ich lieber eine andere Methode, die den Vorteil hat, dass sie universell verwendbar ist, also auch für den gregorianischen Kalender.
Mich würde eher interessieren, auf welchen Wochentag zum Beispiel der 24.12.2016 fällt; an welchem Wochentag Kolumbus sein Ei auf die Spitze gestellt hat ist für mich weniger spannend.

Und hier kurz diese Methode:
Code:
Y=Jahr
YY=das Jahr im Jahrhundert, also Y mod 100.
YH=Das Jahrhundert, also Y div 100.

N1 := YY div 12
N2 := YY mod 12
N3 := N2 div 4
Wenn das Datum vor dem 15.10.1582 liegt:
   N4 := 7 - YH mod 7
sonst:
   N4 := 9 - YH mod 4 * 2
DD := (N1 + N2 + N3 + N4) mod 7
DD ist der Wochentag für den letzten Tag des Februars im Jahr Y. (DD steht für "Doomsday")
Hierbei ist 0 = Sonntag, 1 = Montag, …, 6=Samstag.
Wie kommt man jetzt zum Wochentag für einen bestimmten Tag im Jahr?!

Wenn der letzte Tag im Februar = DD ist, dann sind in den einzelnen Monaten folgende Tage ebenfalls = DD.

1) In allen geraden Monaten > 2 der Tag der = Monat ist. also 4.4, 6.6, 8.8. 10.10. 12.12.
2) Im Mai der 9te, im September der 5te, im Juli der 11te, im November der 7te. Merksatz : "I work from 9 to 5 at the 7-11." (7-Eleven ist eine internationale Einzelhandelskette.)
Fehlen noch Januar um März.
Für März kann man sich merken, dass der 0te März identisch mit dem letzten Tag im Februar wäre.
Für Januar kann man sich merken, dass der 31te DD ist, außer in Schaltjahren, da ist es der 32te.

Das alles könnt ihr hier nachlesen: https://de.wikipedia.org/wiki/Doomsday-Methode

Nehmen wir als Bespiel das heutige Datum (21.01.2016)
N1 = 1 (16 div 12)
N2 = 4 (16 mod 12)
N3 = 1 (N2 div 4)
N4 = 9 (9 - 20 mod 4 * 2)
DD = 1 (N1 + N2 + N3 + N4) mod 7
DD = Montag
Der 32.01 ist Montag, also auch der 25.01. und der 18.01., also ist der 21.01. drei Tage nach Montag, also Donnerstag.

Und für den Computer hier eine kurze Funktion, sowohl für den Julianischen wie auch für den Gregorianischen Kalender.
Die Funktion liefert Werte im Bereich 0 .. 6, wobei 0=Montag und 6=Sonntag ist.
Delphi-Quellcode:
FUNCTION DoomsDayWD(Y,M,D:Integer):Integer;
const MN:Array[1..12] of Integer=(31,28,00,04,09,06,11,08,05,10,07,12);
var YY,X,N1,N2,N3,N4,N5,DD:Integer;
begin
   YY:=Y mod 100;
   N1:=YY div 12;
   N2:=YY mod 12;
   N3:=N2 div 4;
   if (Y<1582) or (Y=1582) and (M<10) or (Y=1582) and (M=10) and (D<15) then begin
      N4:=7-Y div 100 mod 7;
      N5:=Ord((M<3) and (Y mod 4=0));
   end else begin
      N4:=9-2*(Y div 100 mod 4);
      N5:=Ord((M<3) and (Y mod 4=0) and ((Y mod 100<>0) or (Y mod 400=0)))
   end;
   DD:=(N1+N2+N3+N4+6) mod 7; // MO=0, SO=6
   X:=MN[M]+N5;
   Result:=(DD-X+D+35) mod 7;
end;
Tja, und nun hoffe ich, dass ich mich nicht irgendwo vertippt habe - das wäre mir jetzt etwas peinlich.

Wolfgang Mix 21. Jan 2016 14:55

AW: Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
@Amateurprofi

Vielen Dank für deine Antwort.
Ich bin gerade am Kofferpacken, um der Kälte zu entfliehen.

Soviel vorab: Es geht immer noch um "Kopfrechnen" mit möglichst kleinen ganzen Zahlen,
nicht um optimalen Code.

Zum Fehler 1 und seiner Behebung dachte ich : wt + 7 oder wt - 7 ergibt denselben Wochentag wt!
Bei Fehler 2 muss September tatsächlich die Merkziffer 3 sein! Danke für den Hinweis.

Wenn du Mittrings Merkziffern in jeder Zeile 3 addierst, kommt man zu denselben Merkziffern.

Deine Prüfdaten betrachte ich als Hausaufgabe :-)

Zu Deinem Schlusssatz : Ich habe mich tatsächlich vertippt.

Lass mir ein bisschen Zeit, möglicherweise bin ich einige Zeit im Tal der Ahnungslosen ohne Internet (WLAN),
TP und Delphi.

Wolfgang

Amateurprofi 21. Jan 2016 18:09

AW: Kopfrechnen im Julianischen Kalender
 
Zitat:

Zitat von Wolfgang Mix (Beitrag 1327723)
Zum Fehler 1 und seiner Behebung dachte ich : wt + 7 oder wt - 7 ergibt denselben Wochentag wt!

Ja, sollte man meinen.
Aber bei diesen besonderen Daten in 1300 bzw. 0600 sind alle Zwischenergebnisse 0, außer Zahl 5, die ist 1 bzw. 6.
Beispiel:
Datum 28.08.1300
Code:
1. 28 mod 7      = 0 (Zahl 1) (Tag mod 7)
2. K             = 0 (Zahl 2) (Aus Tabelle für Monat 8)
3. 0 div 12      = 0 (Zahl 3) (Jahr im Jahrhundert div 12)
4. 0 mod 12      = 0           (Jahr im Jahrhundert mod 12)
5. 0 div 4       = 0 (Zahl 4) (Jahr im Jahrhundert mod 12 div 4)
6. 13 mod 7      = 1 (Zahl 5) (Jahrhundert mod 7)

Da Zahl 5 subtrahiert wird, ergibt sich ein negatives Ergebnis nämlich -1 bzw. -6.
Und -1 mod 7 ergibt etwas anderes als (-1 + 7) mod 7.

Durch addieren von 7 kommt das Zwischenergebnis wieder in den positiven Bereich.

Wolfgang Mix 21. Jan 2016 18:30

AW: Kopfrechnen im Julianischen Kalender
 
Danke für das Beispiel. Wir sind nicht weit auseinander.

Kopfrechner wissen das schon lange, dass bei negativen Ergebnissen 7 addiert werden muss.

Vielleicht ist meine Kurzanleitung wohl zu kurz.

Amateurprofi 21. Jan 2016 20:18

AW: Kopfrechnen im Julianischen Kalender
 
@Wolfgang,

Ja klar, wenn man im Kopf rechnet, dann korrigiert man negative Werte mehr oder weniger automatisch.

Und: Nach Änderung der Kennziffer für September und Berücksichtigung des Ausgleichs negativer Werte arbeitet dein Algo korrekt, jedenfalls sind die Ergebnisse identtisch mit denen, die die Doomsday Methode liefert.

Wolfgang Mix 21. Jan 2016 20:26

AW: Kopfrechnen im Julianischen Kalender
 
Danke, du hast mir viel Grübelei erspart :-D

Wolfgang Mix 22. Jan 2016 08:07

AW: Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von Amateurprofi (Beitrag 1327760)
Zitat:

Zitat von Wolfgang Mix (Beitrag 1327723)
Zum Fehler 1 und seiner Behebung dachte ich : wt + 7 oder wt - 7 ergibt denselben Wochentag wt!

Ja, sollte man meinen.
Aber bei diesen besonderen Daten in 1300 bzw. 0600 sind alle Zwischenergebnisse 0, außer Zahl 5, die ist 1 bzw. 6.
Beispiel:
Datum 28.08.1300
Code:
1. 28 mod 7      = 0 (Zahl 1) (Tag mod 7)
2. K             = 0 (Zahl 2) (Aus Tabelle für Monat 8)
3. 0 div 12      = 0 (Zahl 3) (Jahr im Jahrhundert div 12)
4. 0 mod 12      = 0           (Jahr im Jahrhundert mod 12)
5. 0 div 4       = 0 (Zahl 4) (Jahr im Jahrhundert mod 12 div 4)
6. 13 mod 7      = 1 (Zahl 5) (Jahrhundert mod 7)

Da Zahl 5 subtrahiert wird, ergibt sich ein negatives Ergebnis nämlich -1 bzw. -6.
Und -1 mod 7 ergibt etwas anderes als (-1 + 7) mod 7.

Durch addieren von 7 kommt das Zwischenergebnis wieder in den positiven Bereich.

Fall 28.08.0600 ist nichts besonderes, das Ergebnis +6 ist Freitag.
Im Fall 28.08.1300 freut sich der Kopfrechner, dass er absolut nichts rechnen muss. Da Samstag ja 0 ist, ist - 1 Freitag:-D

Wolfgang Mix 17. Jul 2016 10:46

AW: Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gültigkeitsbereich erweitert, Tageszuordnung jetzt Mo=1, Di=2 .. So=0,
dazu Monatsmerkzahlen angepasst.

Liebe Grüße

Wolfgang Mix

Wolfgang Mix 18. Jul 2016 22:36

AW: Kopfrechnen im Julianischen Kalender
 
Private Fragen beantworte ich gerne über PN oder
kalenderfragen@gmx.de

Benmik 31. Aug 2016 00:38

AW: Kopfrechnen im Julianischen Kalender
 
Da du auch auf Schreibfehler hingewiesen werden wolltest: Meiner Meinung nach muss das Wort "Ziffer" durch "Zahl" ersetzt werden.

Wolfgang Mix 31. Aug 2016 16:56

AW: Kopfrechnen im Julianischen Kalender
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke, geändert :-)

... obwohl:
https://de.wikipedia.org/wiki/Zahlzeichen


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz