Tage=["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]; TagToStr(z)= { return(Tage[z+1]); \\ 0 -> So } \\ den März zum ersten Monat machen, Jan + Feb zu 11 und 12 des \\ Vorjahres machen, dadurch wird der 28/29. Feb zum letzten Tag im Jahr. ConvertFromNormalDate(Date)= { Date[2]=Date[2]-2; if(Date[2] < 1, Date[3]=Date[3]-1; Date[2]=Date[2]+12; ); return(Date); } \\ genau, wie in Scheid, Zahlentheorie beschrieben: \\ (5 Punkte) getGregorWeekDay(Date, verbose=0)= { local( D= ConvertFromNormalDate(Date) ); local( c,d,t, WochenTag, WochenTagStr ); local( Rm = [2, 5, 0, 3, 5, 1, 4, 6, 2, 4, 0, 3] ); d= (D[3] - 1600)% 100; c= D[3]\ 100; t= 100*(c-16) + d; WochenTag= ( D[1] + Rm[ D[2] ] + 5*c +d +d\4 +c\4)% 7; WochenTagStr= TagToStr(WochenTag); if(verbose, print(" ",Date,": ", WochenTagStr)); return(WochenTagStr); } \\ wie in der Wikipedia beschrieben: \\ http://de.wikipedia.org/wiki/Wochentagsberechnung#Julianischer_Kalender \\ (5 Punkte) getJulianWeekDay(Date, verbose=0)= { local(M, temp, t, m, j, J, WochenTag, WochenTagStr); \\ die reste mod 7 beim jeweils Monatsersten, \\ wegen 31.Januar, hat der 1. Feb den Rest 3, \\ wegen 28. Feb hat der 1. März den Rest 3: 31 + 28 mod 7 M=[ 0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5 ]; t= Date[1] % 7; \\ Tagesziffer m= M[Date[2]] ; \\ Monatsziffer temp= Date[3]% 100; j= (temp + temp\4) % 7; \\ Jahresziffer temp= Date[3]\ 100; J = ((temp - 5) % 7 -6) *(-1) ; \\ Falls Schaltjahr (Julianisch: JEDES vierte Jahr ohne Ausnahme), 1 abziehen S= if( ((Date[2]==1) || (Date[2]==2)) && (Date[3]%4 ==0), -1 ,0); WochenTag = (t+m+j+J+S) % 7; WochenTagStr = TagToStr(WochenTag); /* local(T, m, J, JH, WochenTag, WochenTagStr); T=Date[1]; m=floor(((Date[2]+1)*26)/10); J=Date[3] % 100; JH= Date[3] \ 100; WochenTag = (T + m + J + J\4 +5 - JH -1 \\ eins abziehen, damit der Sonntag auf die Null fällt ) % 7; WochenTagStr = TagToStr(WochenTag); */ if(verbose, print(" ",Date,": ", WochenTagStr)); return(WochenTagStr); } \\ Berechnung auf gregorianisch oder julianisch durchführen, \\ je nachdem ob es vor oder nach dem Stichtag 4.10.1582 liegt. \\ ( Man könnte sich jetzt streiten, da der Stichtag in verschiedenen \\ Ländern zu unterschiedlichen Zeitpunkten eingeführt wurde, aber \\ Kolumbus entdekte Amerika VOR den in Frage kommenden Stichtagen \\ Und der Sturm auf die Bastille fand NACH den in Frage kommenden \\ Stichtagen statt. ) \\ (5 Punkte) für die richtige Fallunterscheidung GetWeekDay(Date, verbose=0)= { \\ Jahr <> 1582, das ist einfach if(Date[3] > 1582, return( getGregorWeekDay( Date, verbose ) ); ); if(Date[3] < 1582, return( getJulianWeekDay( Date, verbose ) ); ); \\ Jahr == 1582 wird komplizierter: if( (Date[3] == 1582 ) && ( (Date[2] > 10) || ((Date[2] == 10) && Date[1] >=15 ) ), \\ nach dem Stichtag return( getGregorWeekDay(Date, verbose) ) ); if( (Date[3] == 1582 ) && ( (Date[2] < 10) || ((Date[2] == 10) && Date[1] < 5 ) ), \\ vor dem Stichtag return(getJulianWeekDay(Date, verbose)) ); \\ und diese Tage gibt es nicht: if( ( Date[3] == 1582 ) && ( Date[2] == 10 ) && ( Date[1] < 15 ) && ( Date[1] > 4 ) , error("Dieses Datum gibt es nicht!"); \\es fiel der Kalenderreform zum Opfer ); } \\ wie es die Aufgabenstellung fordert: getDay(d,m,y)=GetWeekDay([d,m,y]); \\ je ein Punkt für richtigen Tage print("Entdeckung Amerikas: "); GetWeekDay([12,10,1492], 1); print("Sturm auf die Bastille: "); GetWeekDay([14,7,1789], 1); print("Mondlandung: "); GetWeekDay([20,7,1969], 1); print("Wunder von Bern: "); GetWeekDay([4,7,1954], 1); print("Mauerfall: "); GetWeekDay([9,11,1989], 1);