introduzione
Il tempo è confuso. Sessanta secondi a un minuto, sessanta minuti a un'ora, ventiquattro ore al giorno (e per non parlare di quel fastidioso am / pm!).
Oggigiorno non c'è spazio per una tale stupidità, quindi abbiamo deciso di adottare l'unica alternativa sensata: i giorni decimali! Vale a dire, ogni giorno è considerato 1 intera unità e qualsiasi cosa più breve viene scritta come una frazione decimale di quel giorno. Ad esempio, "12:00:00" verrebbe scritto come "0,5" e "01:23:45" potrebbe essere scritto come "0,058159".
Poiché ci vorrà del tempo per abituarsi al nuovo sistema, si ha il compito di scrivere un programma in grado di convertire tra di loro in entrambe le direzioni.
Sfida
Scrivi un programma nella lingua che preferisci, che dato un tempo moderno nel formato ISO-8601 di "hh: mm: ss", restituirà la frazione decimale equivalente. Allo stesso modo, data una frazione decimale, il programma dovrebbe restituire l'ora nel formato moderno inizialmente specificato.
È possibile formulare le seguenti ipotesi:
- L'ingresso e l'uscita moderni possono variare da "00:00:00" a "24:00:00"
- L'ingresso e l'uscita del tempo decimale possono variare da "0" a "1" e dovrebbero essere in grado di accettare / emettere fino ad almeno 5 cifre decimali (come "0.12345"). Più precisione è accettabile
- Il programma dovrebbe essere in grado di sapere quale direzione di conversione eseguire in base all'input
- Non è possibile utilizzare le funzioni / librerie relative al tempo
Il vincitore sarà determinato dal codice più breve che soddisfa i criteri. Saranno selezionati in almeno 7 unità decimali di giorno o se / quando ci sono stati abbastanza invii.
Esempi
Ecco un (n intenzionalmente) pezzo di codice JavaScript mal scritto da usare come esempio:
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
n
dove n
è 2 ^ n secondi. Quindi un valore di '6' aveva un TTL di circa 1 minuto. Un valore di '12' aveva un TTL di circa 1 ora. '15' erano circa 8 ore e così via. Permetteva a un byte di definire il timeout e offrirti un controllo sufficiente per tempi brevi o lunghi.