introduction
Le temps est déroutant. Soixante secondes à une minute, soixante minutes à une heure, vingt-quatre heures à un jour (et sans parler de ce satané am / pm!).
Il n'y a pas de place pour une telle bêtise de nos jours, nous avons donc décidé d'adopter la seule alternative sensée: les jours décimaux! C'est-à-dire que chaque jour est considéré comme 1 unité entière, et tout ce qui est plus court est écrit comme une fraction décimale de ce jour. Ainsi, par exemple: «12:00:00» serait écrit comme «0,5» et «01:23:45» pourrait être écrit comme «0,058159».
Parce qu'il faudra du temps pour s'habituer au nouveau système, vous êtes chargé d'écrire un programme qui peut convertir entre eux dans les deux directions.
Défi
Écrivez un programme dans la langue de votre choix, qui, étant donné une heure moderne au format ISO-8601 de "hh: mm: ss", renverra l'unité de fraction décimale équivalente. De même, étant donné une fraction décimale, le programme doit renvoyer l'heure au format moderne initialement spécifié.
Vous pouvez faire les hypothèses suivantes:
- L'entrée et la sortie de l'heure moderne peuvent aller de "00:00:00" à "24:00:00"
- L'entrée et la sortie du temps décimal peuvent aller de "0" à "1" et doivent pouvoir accepter / sortir jusqu'à au moins 5 décimales (telles que "0,122345"). Plus de précision est acceptable
- Le programme doit être capable de savoir quelle direction de conversion effectuer en fonction de l'entrée
- Vous ne pouvez pas utiliser les fonctions / bibliothèques liées au temps
Le gagnant sera déterminé par le code le plus court qui remplit les critères. Ils seront sélectionnés en au moins 7 unités de jour décimal, ou si / quand il y a eu suffisamment de soumissions.
Exemples
Voici un morceau de code JavaScript (n intentionnellement) mal écrit à utiliser comme exemple:
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
où se n
trouve 2 ^ n secondes. Ainsi, une valeur de «6» avait un TTL d'environ 1 minute. Une valeur de «12» avait un TTL d'environ 1 heure. «15» était d'environ 8 heures et ainsi de suite. Il a permis à un octet de définir le délai d'expiration et de vous donner suffisamment de contrôle pour des temps courts ou longs.