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
la source
n
où sen
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.Réponses:
CJam,
58 5642 octetsJe suis sûr que c'est trop long et qu'on peut beaucoup jouer au golf. Mais voici pour commencer:
Essayez-le en ligne ici
la source
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
:, je supprime ma réponse. Il enmo
est ainsi que 0.058159 se convertit en 01:23:45Python 2,
159150141 + 2 = 143 octetsUne solution simple, peut probablement être beaucoup plus courte. Va y travailler.
Ajout de deux octets pour tenir compte de l'entrée devant être placée entre "s. De plus, Sp3000 a signalé un problème d'interprétation des octaux par eval () et a montré un moyen de raccourcir le formatage, d'utiliser map () et de supprimer une impression.
Découvrez-le sur ideone ici.
la source
Javascript ( ES6 ),
116110 bytesCommenté:
la source
24:00:00
produit1
mais l'inverse n'est pas vraiPython 3: 143 octets
Même nombre d'octets que la solution python 2, mais il semble que nous ayons adopté des approches mathématiques différentes.
la source
Julia,
152143142 octetsEh bien, j'ai mis à jour mon approche pour être moins "Julian", comme on dit, pour le golf. Pour une meilleure approche (quoique moins concise), consultez l'historique des révisions.
Cela crée une fonction sans nom qui accepte une chaîne ou un nombre à virgule flottante 64 bits et renvoie un nombre ou une chaîne à virgule flottante 64 bits, respectivement. Pour l'appeler, donnez-lui un nom, par exemple
f=x->...
.Non golfé + explication:
Exemples:
la source
C, 137 octets
Programme C complet. Prend des entrées sur stdin et des sorties sur stdout.
Non golfé et commenté:
la source
J, 85 octets
Résultats:
T '12: 00: 00 '
0,5
T 0,5
12 0 0
T '12: 34: 56 '
0,524259
T 0,524259
12 34 56
Total 85
la source
Javascript,
194192190 190188 octetsla source
JavaScript ES6,
98130 octetsla source
C,
156152 octetsJe pensais que ça allait être facile pour C. Mais j'ai quand même fini assez gros. :(
Programme de test:
Production:
la source
PHP,
7069 octetsprend l'entrée de l'argument de ligne de commande, imprime dans STDOUT:
Si l'entrée contient deux points, convertissez en heure unix et divisez par (secondes par jour),
sinon valeur numérique à plusieurs chiffres avec (secondes par jour) et formatez l'heure unix en
hh:mm:ss
.la source
Perl,
109108101 + 6 (-plaF:
drapeau) = 107 octetsEn utilisant:
Essayez-le sur Ideone.
la source
Excel, 178 octets
la source