Ja, der Code ist nicht fertig - ist ja nicht mein Hauptanliegen. Juan, Du darfst gerne daran weiterbasteln.
Nun zu den Fragen und Bemerkungen:
@Juan + Jan
Die Sonderregelung mit dem Schaltjahr kannte ich nicht => Ich schreibs mir gleich ins Büchlein. Hier die Korrektur, als Snippet.
Code:
p jahr_teilbar_400 = ((jahr % 400) == 0)
p jahr_teilbar_100 = ((jahr % 100) == 0)
p jahr_teilbar_4 = ((jahr % 4) == 0)
p schaltjahrtag = ((jahr_teilbar_4 and not jahr_teilbar_100) or jahr_teilbar_400) ? 1 : 0 # Pickaxe ~ Seite 97
@Juan - 2D-Array?:
Tja, was macht .. ?
Code:
schaltjahrtag = [1, 0, 0, 0][($3.to_i % 4)]
Was Du hier siehst sind zwei Dinge in einem und kein 2D-Array. Als erstes wird eine Array erstellt. Ein Array ist im Vergleich zum Hash eine Struktur wo über die Position des Elements auf ein Element zugegriffen wird. In einem Hash nimmst Du ein Schlüssel, eine Zahl, ein Wort oder einen Code. Bei Dir war der Schlüssel der Monatsname und der Wert die Tage des Monats "{Mai => 31}". Im zweiten Schritt nimmst Du das Element aus einer bestimmten Position heraus. Damit ist das da oben ein SWITCH-CASE-Konstrukt und hätte auch so aussehen können:
Code:
schaltjahr_abfolge = [1, 0, 0, 0]
schaltjahrtag = schaltjahr_abfolge[($3.to_i % 4)]
Die Positionen in der schaltjahr_abfolge sind so gewählt, dass für den Modulowert aus der Jahreszahl, die Anzahl der zusätzlichen Tage eines Schaltjahres folgen. Ist das Jahr glatt durch 4 teilbar so ergibt das '0' und auf der Pos '0' im Array steht die '1'. Sonst liefert es bei den anderen Werten eine '0'. Damit habe ich eine Variable 'schaltjahrtag', die ich nun immer im Alg. benutzen kann, da sie falls kein Schaltjahr ist, in der Addition, keinen Einfluss hat.
Hinweis: Mehr-dimensionale Arrays werden in Ruby durch eine explizite Deklaration oder durch eine deutliche Zuweisung erstellt. Beispiel:
Code:
schachbrett = Array.new(2){ Array.new}
# erste Reihe links-nach-rechts
schachbrett[1][1] = "Turm"
schachbrett[1][2] = "Springer"
schachbrett[1][3] = "Laeufer"
schachbrett[1][4] = "Koenigin"
schachbrett[1][5] = "Koenig"
schachbrett[1][6] = "Laeufer"
schachbrett[1][7] = "Springer"
schachbrett[1][8] = "Turm"
# zweite Reihe - nur Bauern!
schachbrett[2] = Array.new( 8, "Bauer") # (1)
p schachbrett[1][6], schachbrett[2][6]
p schachbrett[2][0], schachbrett[2][8] # <- Einer meiner Lieblingsfehler, such den Bug (vielleicht Nahe (1))
p schachbrett # Schau genau hin -> schachbrett[0][0]
Ich denke jetzt klickts es auch mit der nächsten Frage: "print "k", wenn array eintritt?". Du siehst hier das gleiche Prinzip. Das 'k' ist nur eine Wert in einem 1D-Array und wird, falls schaltjahrtag = 0 ausgegeben, denn dann ist k_ein Schaltjahr. Falls schaltjahrtag = 1 dann ist natürlich _ein Schaltjahr. <= Ein Spiel mit der deutschen Sprache. (Hinweis: Arrays beginnen mit '0' statt mit '1' mit der Zählweise <= Und dass vergesse ich auch leider manchmal . Schaue in die Pickaxe ~ Seite 431 zu Arrays.)
@Juan - Ansatz:
Ich habe mir eine Referenzansatz gewählt (Erinnere in den Mathelink zu Zahlenfolgen). Wenn ich im Pogram fest einprogrammiere, dass der XX.YY.ZZZZ ein Montag war, dann brauche ich nur ausreichnen, wie viele Tage seit dem vergangen sind und Teile diese Zahl durch 7. Bsp: Diverenz ist 14, so ist 14 % 7 = 0. Also Monat + 0 = Montag. Ist ein allerdings 76 Tage her .. 76 % 7 = 6. Also Montag + 6 = Sonntag. Mein Beispielcode kann auch an dieser Stelle erweitert werden, denn es werden erstmal nur Tage diesen Jahres sinnvoll bestimmt.
Dieser Ansatz ist nicht neu - denn selbst in Java wird die aktuelle Zeit als Referenzgröße auf ein festes Datum ausgegeben. Beleg
Code:
// get time in milliseconds since 1970 Jan 1
long timestamp = System.currentTimeMillis();
Gut. Fröhliches Kämpfen.
Daniel
PS: Ich geb zu ist im Code schon etwas dick aufgetragen, aber Ruby machts möglich.
PPS: Irgendwie ist mein Deutsch heute komisch - naja - wer Fehler findet, darf sie behalten.
Lesezeichen