Mein PPCG-Urlaub ist vorbei: D.
Intro
Bruchzeit ist the year + (the value (minute of year) / number of minutes in the year)
.
Beispielberechnung
Sie sollten davon ausgehen, dass der Februar immer 28 Tage hat und das Jahr immer 365 Tage lang ist.
Angenommen, wir möchten die Zeit 17:34 3rd March 2013
in Bruchzeit umrechnen . Zunächst finden Sie heraus, wie viele Minuten 2013 waren: 525600 Minuten . Nennen wir das x
.
Als nächstes möchten Sie herausfinden, wie viele Minuten seit Anfang 2013 vergangen sind. Ein paar schnelle Berechnungen zeigen Ihnen, dass die Antwort 88894 Minuten lautet:
Seit Jahresbeginn sind 61 Tage vergangen, was 1440 (Anzahl der Minuten pro Tag) 87840 Minuten entspricht. In 17 Stunden sind 1020 Minuten (17 * 60). Jetzt können wir 87840, 1020 und 34 Minuten hinzufügen, was 88894 Minuten entspricht.
Nennen wir das y
.
Schließlich dividieren Sie y
durch x
und addieren das Jahr, was zu 2013.16912
(auf 5 Dezimalstellen) führt.
Eingang
Datum und Uhrzeit werden als einzelne Zeichenfolge angegeben. Die Zeichenfolge hat das folgende Format:
YYYY-MM-DD hh:mm
Die Zeit wird immer im 24-Stunden-Format sein und das Jahr wird immer im Bereich von 1900 bis einschließlich 2050 liegen.
Beispiele
Input: 2016-08-06 23:48
Output: 2016.59723
Input: 2013-03-03 17:34
Output: 2013.16912
Input: 1914-11-11 11:11
Output: 1914.86155
Wenn Sie sich für das Kopfgeld entscheiden, rufen Sie mich entweder in den Kommentaren oder im neunzehnten Byte an .
Herausforderung
Berechnen Sie das angegebene Datum und die angegebene Uhrzeit als Bruchjahr.
Geben Sie die gesamte Ausgabe auf fünf Dezimalstellen ein (Sie können beliebig runden: Bodenbelag, Decke oder echte Rundung). Der kürzeste Code gewinnt.
Kopfgeld
Ich biete eine Prämie von 100 Wiederholungen für das kürzeste Programm an, das auch das Datum im Bruchjahresformat akzeptiert und die Uhrzeit im YYYY-MM-DD hh:mm
Format zurückgibt . Im Wesentlichen muss Ihr Programm (oder Ihre Funktion) folgendermaßen handeln:
f('1914-11-11 11:11') => 1914.86155
f('1914.86155') => 1914-11-11 11:11
For this, assume February has 28 days and the year is 365 days long.
, aber auch... using the Gregorian calendar.
Antworten:
TSQL, 63 Bytes
Dies ist eine kürzere Version als meine ursprüngliche Antwort, da meine erste Antwort die Berechnung für das Schaltjahr beinhaltete.
Geige
Das folgende SQL kann beide Eingabetypen verarbeiten
TSQL, 154 Bytes
Kombinierte Geige 1
Kombinierte Geige 2
quelle
JavaScript (ES6), 84 Byte
Unter der Annahme, dass keine Schaltjahre oder Sommerzeit erforderlich sind, ersetze ich das Jahr durch 1970, wodurch
Date.parse
der Zeitversatz in Millisekunden, von dem es31536000000
1970 (oder in der Tat jedes andere Nicht-Schaltjahr) gab, direkt zurückgegeben wird . Dann muss ich nur noch das Jahr addieren und auf 5 Dezimalstellen runden. Bearbeiten: Bidirektionale Konvertierung in183178 Bytes:Angenommen, Zeichenfolgen, die ein
:
Zeitformat enthalten, werden wie oben behandelt, andernfalls wird das Jahr entfernt, in Millisekunden konvertiert, eine halbe Minute für Rundungszwecke hinzugefügt, 1970 in ein Datum konvertiert, Monat, Tag, Stunde und Minute extrahiert und das vorangestellt ursprüngliches Jahr.quelle
s
ist das Argument für die Funktion.Matlab,
132115 BytesRunden gegen 0.
Hmmm ... das ist ziemlich lang.
Das nutzt einige eingebaute, aber nicht die wirklich hilfreichen - wegen der Schaltjahre.
Das direkte Parsen des Strings ergibt 2 weitere Byte-Lösungen:
Neuere Matlab-Versionen haben wahrscheinlich eine bessere Split-Funktion, aber ich verwende 2012a.
Einige Bytes wurden dank @Luis Mendo gespeichert
quelle
[-1 '# #"#"##"#"'-4]
, um einige Bytes zu speichern. Sindyear
usw. Standardfunktionen? Wenn Sie eine Toolbox verwenden, sollten Sie diese im Titel angeben, z. B. "Matlab with Financial Toolbox"#
Notation nicht vertraut und bin ihr noch nie begegnet. Wo kann ich mehr darüber lesen (schnelle Google-Suche hat nicht geholfen)? Ich denke, dieyear
usw. sind Standardfunktionen, aber ich weiß nicht, ob sie sich außerhalb der Toolbox (Dokumente) gleich verhalten .PowerShell v3 +, 131 Byte
Nimmt Eingaben auf
$args[0]
und konvertiert sie mitGet-Date
, um sie im .NET-[datetime]
Format zu speichern$t
. Berechnet, ob der 29. Februar existiert, und legt fest,$a
dass der Minutenwert dieses Datums (falls vorhanden) abgezogen wird.Dann wir die Verwendung
-f
Ormat Operators mit einer festen String Spezifikation von 5 Dezimalstellen durch die Berechnung auszuführen. Verwendet integrierte Funktionen, um die.DayOfYear
und die.TotalMinutes
Eingabe zu berechnen , zu subtrahieren,$a
wenn es sich um ein Schaltjahr handelt, durch die525600
Gesamtzahl der Minuten zu dividieren und die Eingabe zu addieren.Year
.Wird sich (wörtlich) bei STDERR beschweren, wenn der 29. Februar nicht existiert (siehe Beispiele unten), aber da STDERR standardmäßig ignoriert wird, machen wir uns darüber keine Sorgen. Beachten Sie außerdem, dass PowerShell standardmäßig die Rundung von Bankern durchführt.
Beispiele
Alternativ mit Schaltjahren 119 Bytes
Wenn wir den Kalendereinstellungen folgen, können wir ein Dutzend Bytes sparen, da wir
$a
im obigen Originalcode nicht berücksichtigen müssen. Dies ermöglicht es uns,$t
in den Ausdruck selbst zu wechseln , und wir werden den.DayOfYear
für den 31. Dezember explizit berechnen . Ansonsten folgt die gleiche Methodik.quelle
Python 3,
163173 Bytesmehr Bytes aufgrund des Ausgabeformats
verwendet keine eingebauten Datumsangaben wie die Java-Antwort.
etwas besser lesbar
quelle
Perl 6 ,
107 105102 BytesErläuterung:
Prüfung:
quelle