Einführung
Die Zeit ist verwirrend. Sechzig Sekunden zu einer Minute, sechzig Minuten zu einer Stunde, vierundzwanzig Stunden zu einem Tag (und ganz zu schweigen von diesem lästigen Morgen / Morgen!).
Für eine solche Dummheit ist heutzutage kein Platz mehr, deshalb haben wir uns für die einzig sinnvolle Alternative entschieden: Dezimaltage! Das heißt, jeder Tag wird als eine ganze Einheit betrachtet, und alles Kürzere wird als Dezimalbruch dieses Tages geschrieben. So würde beispielsweise "12:00:00" als "0,5" und "01:23:45" als "0,058159" geschrieben.
Da es einige Zeit dauert, um sich an das neue System zu gewöhnen, müssen Sie ein Programm schreiben, das zwischen beiden Richtungen konvertiert.
Herausforderung
Schreiben Sie ein Programm in der Sprache Ihrer Wahl, das bei einer modernen Zeit im ISO-8601-Format "hh: mm: ss" die entsprechende Dezimalbrucheinheit zurückgibt. Ebenso sollte das Programm bei einem Dezimalbruch die Zeit in dem ursprünglich angegebenen modernen Format zurückgeben.
Sie können folgende Annahmen treffen:
- Die Ein- und Ausgabe der modernen Zeit kann von "00:00:00" bis "24:00:00" reichen.
- Die Eingabe und Ausgabe der Dezimalzeit kann von "0" bis "1" reichen und sollte in der Lage sein, bis zu mindestens 5 Dezimalstellen (z. B. "0.12345") zu akzeptieren / auszugeben. Mehr Präzision ist akzeptabel
- Das Programm sollte anhand der Eingabe wissen, welche Konvertierungsrichtung auszuführen ist
- Sie können keine zeitbezogenen Funktionen / Bibliotheken verwenden
Der Gewinner wird anhand des kürzesten Codes ermittelt, der die Kriterien erfüllt. Sie werden in Einheiten von mindestens 7 Dezimaltagen ausgewählt, oder wenn / wenn es genügend Einreichungen gegeben hat.
Beispiele
Hier ist ein (absichtlich) schlecht geschriebener Teil des JavaScript-Codes, der als Beispiel dienen soll:
function decimalDay(hms) {
var x, h, m, s;
if (typeof hms === 'string' && hms.indexOf(':') > -1) {
x = hms.split(':');
return (x[0] * 3600 + x[1] * 60 + x[2] * 1) / 86400;
}
h = Math.floor(hms * 24) % 24;
m = Math.floor(hms * 1440) % 60;
s = Math.floor(hms * 86400) % 60;
return (h > 9 ? '' : '0') + h + ':' + (m > 9 ? '' : '0') + m + ':' + (s > 9 ? '' : '0') + s;
}
decimalDay('02:57:46'); // 0.12344907407407407
decimalDay('23:42:12'); // 0.9876388888888888
decimalDay(0.5); // 12:00:00
decimalDay(0.05816); // 01:23:45
quelle
n
demn
2 ^ n Sekunden liegen. Ein Wert von '6' hatte also eine TTL von ungefähr 1 Minute. Ein Wert von '12' hatte eine TTL von ungefähr 1 Stunde. 15 war ungefähr 8 Stunden und so weiter. Es erlaubte einem Byte, das Zeitlimit zu definieren und Ihnen genügend Kontrolle für kurze oder lange Zeiten zu geben.Antworten:
CJam,
58 5642 BytesIch bin sicher, das ist zu lang und kann viel golfen. Aber hier geht für den Anfang:
Probieren Sie es hier online aus
quelle
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
. Ich lösche meine Antwort. Dasmo
ist so, dass 0.058159 zu 01:23:45 konvertiertPython 2,
159150141 + 2 = 143 BytesEinfache Lösung, kann wahrscheinlich viel kürzer sein. Wird daran arbeiten.
Es wurden zwei Bytes hinzugefügt, um zu berücksichtigen, dass Eingaben in "s" eingeschlossen werden müssen. Außerdem wies Sp3000 auf ein Problem bei der Interpretation von Oktalen durch eval () hin und zeigte eine Möglichkeit, die Formatierung zu verkürzen, map () zu verwenden und einen Ausdruck zu entfernen.
Schau es dir auf ideone hier an.
quelle
Javascript ( ES6 ),
116 -110 ByteKommentiert:
quelle
24:00:00
produziert1
aber dasPython 3: 143 Bytes
Gleiche Byteanzahl wie bei der Python 2-Lösung, aber anscheinend haben wir unterschiedliche Ansätze für die Mathematik gewählt.
quelle
Julia,
152143142 BytesNun, ich habe meine Herangehensweise aktualisiert, um weniger "Julian" zu sein, wie man sagt, um Golf zu spielen. Eine bessere (wenn auch weniger präzise) Vorgehensweise finden Sie im Revisionsverlauf.
Dadurch wird eine unbenannte Funktion erstellt, die eine Zeichenfolge oder eine 64-Bit-Gleitkommazahl akzeptiert und eine 64-Bit-Gleitkommazahl bzw. eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=x->...
.Ungolfed + Erklärung:
Beispiele:
quelle
C 137 Bytes
Volles C-Programm. Übernimmt die Eingabe für stdin und die Ausgabe für stdout.
Ungolfed und kommentiert:
quelle
J, 85 Bytes
Ergebnisse:
T '12: 00: 00 '
0.5
T 0,5
12 0 0
T '12: 34: 56 '
0,524259
T 0,524259
12 34 56
Insgesamt 85
quelle
Javascript,
194192190188 Bytesquelle
JavaScript ES6,
98130 Bytesquelle
C,
156152 BytesIch dachte, es wird einfach für C, aber es ist trotzdem ziemlich groß geworden. :(
Testprogramm:
Ausgabe:
quelle
PHP,
7069 BytesNimmt Eingaben vom Kommandozeilenargument und druckt diese an STDOUT:
Wenn die Eingabe einen Doppelpunkt enthält, konvertieren Sie sie in Unix-Zeit und dividieren Sie sie durch (Sekunden pro Tag).
Anderenfalls multiplizieren Sie den numerischen Wert mit (Sekunden pro Tag) und formatieren Sie die Unix-Zeit in
hh:mm:ss
.quelle
Perl,
109108101 + 6 (-plaF:
Flag) = 107 BytesVerwenden von:
Probieren Sie es auf Ideone.
quelle
Excel, 178 Bytes
quelle