Auf meiner Website geben Benutzer ihr Geburtsdatum im Stil ein xx.xx.xx
- drei zweistellige Zahlen, die durch Punkte getrennt sind. Leider habe ich vergessen, den Benutzern genau mitzuteilen, welches Format sie verwenden sollen. Ich weiß nur, dass ein Abschnitt für den Monat, einer für das Datum und einer für das Jahr verwendet wird. Das Jahr liegt definitiv im 20. Jahrhundert (1900-1999), also 31.05.75
bedeutet das Format 31 May 1975
. Ich gehe auch davon aus, dass jeder entweder den Gregorianischen oder den Julianischen Kalender verwendet.
Jetzt möchte ich meine Datenbank durchsuchen, um das Chaos zu beseitigen. Ich möchte zunächst mit den Benutzern mit den mehrdeutigsten Daten umgehen, dh mit denen, bei denen der Bereich möglicher Daten am größten ist.
Zum Beispiel 08.27.53
bedeutet das Datum 27 August 1953
entweder im Gregorianischen oder im Julianischen Kalender. Das Datum im julianischen Kalender ist 13 Tage später, die Reichweite ist also gerecht 13 days
.
Im Gegensatz dazu kann sich die Notation 01.05.12
auf viele mögliche Daten beziehen. Das früheste ist 12 May 1901 (Gregorian)
und das späteste ist 1 May 1912 (Julian)
. Die Reichweite beträgt 4020 days
.
Regeln
- Die Eingabe ist eine Zeichenfolge im Format
xx.xx.xx
, bei der jedes Feld zweistellig und mit Nullen aufgefüllt ist. - Die Ausgabe ist die Anzahl der Tage im Bereich.
- Sie können davon ausgehen, dass die Eingabe immer ein gültiges Datum ist.
- Sie dürfen keine integrierten Datums- oder Kalenderfunktionen verwenden.
- Der kürzeste Code (in Bytes) gewinnt.
Testfälle
01.00.31
=>12
29.00.02
=>0
(Die einzige Möglichkeit ist29 February 1900 (Julian)
)04.30.00
=>13
06.12.15
=>3291
5, May 1975
sein31st
? Müssen wir auch Schaltjahre berücksichtigen?Antworten:
Pyth, 118 Bytes
Probieren Sie es online aus: Demonstration oder Test Suite .
Notwendige Kenntnisse der julianischen und gregorianischen Kalender
Julian und Gregorianischer Kalender sind ziemlich ähnlich. Jeder Kalender unterteilt ein Jahr in 12 Monate mit jeweils 28 bis 31 Tagen. Die genauen Tage in einem Monat sind
[31, 28/29 (depends on leap year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
. Der einzige Unterschied zwischen den Kalendern besteht in der Definition eines Schaltjahres. Im Julianischen Kalender ist jedes durch 4 teilbare Jahr ein Schaltjahr. Der Gregorianische Kalender ist etwas spezifischer. Jedes durch 4 teilbare Jahr ist ein Schaltjahr, mit Ausnahme des durch 100 teilbaren und nicht durch 400 teilbaren Jahres.Im 20. Jahrhundert ist also nur ein Jahr anders. Das Jahr 1900, das im julianischen Kalender ein Schaltjahr ist, im gregorianischen Kalender jedoch kein Schaltjahr. Das einzige Datum, das in dem einen Kalender, aber nicht im anderen Kalender vorhanden ist, ist der Tag
29.02.1900
.Aufgrund der unterschiedlichen Schaltjahrdefinition gibt es einen Unterschied zwischen einem Datum im Julianischen Kalender und dem Gregorianischen Kalender. 12 Tage Unterschied für ein Datum vor dem
29.02.1900
und 13 Tage Unterschied für Daten nach dem29.02.1900
.Vereinfachter Pseudocode
Detaillierte Code-Erklärung
Der erste Teil
M++28@j15973358 4G&qG2!%H4
definiert eine Funktiong(G,H)
, die die Anzahl der Tage im MonatG
eines JahresH
im Julianischen Kalender berechnet .Und der nächste Teil ist nur die for-Schleife und das ifs. Beachten Sie, dass ich
N
im Format interpretiere(month, year, day)
. Nur weil es einige Bytes spart.quelle
Perl 5 , 294 Bytes
Probieren Sie es online aus!
298 Bytes, wenn Leerzeichen, Zeilenumbrüche und Kommentare entfernt werden.
1-4 initialisiert Linien die (falls noch nicht geschehen)
%g
und%j
Hashes , wo die Werte den gregorianischen und julianischen Tag Zahlen entsprechend vom 1. Jaunary 1900 bis zu zählen bis 31. Dezember 1999.Zeile 5 setzt das Eingabedatum in $ 1, $ 2 und $ 3.
Zeile 9 listet alle sechs Permutationen dieser drei Eingangsnummern auf.
Zeile 8 wandelt diese sechs in zwei Zahlen um, die gregorianische und die julianische Tageszahl, aber nur diejenigen, die gültige Daten sind.
Zeile 7 stellt sicher, dass nicht vorhandene Tageszahlen herausgefiltert werden.
Zeile 6 sortiert die Liste der gültigen Datumsnummern vom kleinsten zum größten.
Zeile 10 gibt dann die Differenz zwischen dem letzten und dem ersten (max und min) zurück, die der gewünschte Bereich war.
quelle