Ein weiteres Problem bei der Datumsmanipulation: P.
Aufgabe
Schreiben Sie ein Programm oder eine Funktion, die die Differenz zwischen zwei von einem Benutzer angegebenen Daten berechnet.
Input-Output
Ähnlich wie bei der vorherigen Eingabe sind die Eingaben zwei YYYYMMDD
s, die durch ein Leerzeichen , ein Komma
,
oder ein Minuszeichen getrennt sind -
.
Beispiel für Eingabewerte:
20100101-20010911
20110620-20121223
19000101 20101010
33330101,19960229
00010101 99991231
Die Ausgabe ist eine Ganzzahl, die die Differenz zwischen zwei Daten in Tagen darstellt.
Zum Beispiel Input- 20110101-20100101
Erträge 365
und 33320229 17000101
Erträge 596124
.
Sie können Ergebnisse testen hier hier . (Siehe die Kommentare von rintaun unten.) Wenn zwei Daten identisch sind, sollte das Programm zurückkehren 0
, wenn das Datum gültig ist (siehe Punktzahl ).
Beschränkung
Natürlich Sie müssen nicht verwenden alle Arten von Funktion / Klasse / ..., die Zeitstempel oder das Datum bezogen sind, und sollten Sie gregorianischen Kalender .
Ergebnis
Wenn Ihr Code die Einschränkung nicht einhält, dann score = -∞
.
Standard bonus
ist 1.
- Wenn Ihr Code unabhängig von der Reihenfolge der Eingaben funktioniert (z. B.
20100101,20110101
return365
oder-365
) ,bonus+=1
. - Wenn Ihr Code das Jahr 0 verarbeiten kann ,
bonus+=0.5
. - Wenn Ihr Code einen ungültigen Monat (zwischen 1 ~ 12) / Datum (zwischen 1 ~ 31) wie
20109901
oder erkennt34720132
und drucktE
(& das Programm beendet oder so etwas zurückgibt0
) ,bonus+=1
. - Unabhängig von der obigen Regel, wenn Ihr Code ungültige Daten wie
20100230
,20100229
oder oder erkennt20111131
und drucktE
(& das Programm beendet oder so etwas zurückgibt0
) ,bonus+=1
. - Unabhängig von den beiden oben genannten Regeln, wenn Ihr Code eine ungültige Eingabezeichenfolge wie
20100101|20100202
oder erkennt2010010120100202
und drucktE
(& das Programm beendet oder so etwas zurückgibt0
) ,bonus+=1
.
score = floor(-4.2*code.length/bonus)
. Code mit der höchsten Punktzahl gewinnt. Wenn zwei Top-Codes die gleiche Punktzahl haben, gewinnen Codes mit dem höchsten Bonus. Wenn zwei Top-Codes dieselbe Punktzahl und denselben Bonus haben, gewinnen Codes mit den höchsten Stimmen.
(Fällig: Wenn es mehr als 5 Codes gibt, die mehr als (oder gleiche) +1
Stimmen haben.)
20040229
. : P365*4 + 2 + 2
= 1464. Danke für die Information!Antworten:
Perl 5,14, Punktzahl = -162
-163-181-196-214-167-213-234-p
OptionCode
Berechnet eine modifizierte julianische Tageszahl für jedes Datum (ohne Berücksichtigung der epochenbezogenen Anpassungen, um die Codelänge zu sparen) und subtrahiert die beiden. (Ref. "Julian Day" bei Wikipedia ).
/r
Option auf die Substitutionen30+($m&1^$m>7)
Teil gibt die Länge eines Monats außer Februar an; Der Rest wird für den Februar in einem normalen oder Schaltjahr angepasstAnnahmen
00000101-00010101
dass 366 angegeben werden sollte, da 0 ein ganzzahliges Vielfaches von 400 ist und das Jahr 0 also ein Schaltjahr ist.quelle
20111300-20119999
Rückgaben2717
.PHP, Punktzahl: -539.1
Code
Ungolfed
Hinweis
Berechnet die Anzahl der Tage durch Durchlaufen jedes gültigen Datums zwischen den beiden angegebenen. Bei größeren Reichweiten ist es ziemlich langsam. Ich bin mir sicher, dass dies nicht der beste Weg ist, dies zu lösen, aber ich wurde ungeduldig, und das ist es, was ich am Ende hatte. :) :)
Ich weiß auch, dass der "ungolfed" -Code immer noch nicht sehr gut lesbar ist, aber ein vollständiges Umschreiben würde zu viel Aufwand erfordern.
quelle
Ruby 1.9, Punktzahl: -175
-186-191-199243250260ZeichenDer Code akzeptiert Eingaben über stdin.
Anmerkungen:
(!x[e]||e*f<1||f>x[e])
Bedingung behandelt die ungültigen Monats- / Tag- / Datumsboni.33320229 17000101
zu596134
.quelle
Python, Punktzahl: -478
Lösung:
Ich habe keine "ungolfed" -Version, da ich sie so geschrieben habe. Ich habe es nicht richtig getestet. Wenn Sie einen Fehler finden, kommentieren Sie ihn bitte.
edit: hoffentlich wurde ein Fehler behoben, auf den in einem Kommentar hingewiesen wurde, und das Auspacken in Form von [a, b], [c, d] = [[1,2], [3,4] hinzugefügt.
quelle
E
. (FYI,0>-1>12
,0>6>12
,0>13>12
kehrtFalse
.)x<y<z
Vergleich durchführt oder dass es eine gibtx if y else z
. Versucht, es zu beheben.[x,z][y]
das kürzer ist alsx if y else z
, obwohl es nicht immer funktioniert, da es im Gegensatz zum if-Ausdruck nicht faul ist.PHP, Punktzahl: -516
Zeichen:
685676Bonus: 5.5
quelle
<?
am Anfang ausgeführt werden, andernfalls wird nur der Code ausgedruckt.