Introducción
El tiempo es confuso. Sesenta segundos a un minuto, sesenta minutos a una hora, veinticuatro horas a un día (¡sin mencionar esa molesta mañana / tarde!).
Hoy en día no hay lugar para tales tonterías, así que hemos decidido adoptar la única alternativa sensata: ¡días decimales! Es decir, cada día se considera 1 unidad completa, y cualquier cosa más corta se escribe como una fracción decimal de ese día. Entonces, por ejemplo: "12:00:00" se escribiría como "0.5" y "01:23:45" podría escribirse como "0.058159".
Debido a que llevará tiempo acostumbrarse al nuevo sistema, tiene la tarea de escribir un programa que pueda convertir entre ellos en ambas direcciones.
Desafío
Escriba un programa en el idioma que elija, que dado un tiempo moderno en el formato ISO-8601 de "hh: mm: ss", devolverá la unidad de fracción decimal equivalente. Asimismo, dada una fracción decimal, el programa debería devolver la hora en el formato moderno inicialmente especificado.
Puede hacer los siguientes supuestos:
- La entrada y salida de tiempo moderno puede variar de "00:00:00" a "24:00:00"
- La entrada y salida de tiempo decimal puede variar de "0" a "1", y debe ser capaz de aceptar / emitir hasta al menos 5 decimales (como "0.12345"). Más precisión es aceptable
- El programa debería poder saber qué dirección de conversión realizar en función de la entrada
- No puede usar funciones / bibliotecas relacionadas con el tiempo
El ganador será determinado por el código más corto que cumpla con los criterios. Se seleccionarán en al menos 7 unidades de día decimal, o si / cuando ha habido suficientes envíos.
Ejemplos
Aquí hay una (n intencionalmente) pieza de código JavaScript mal escrita para usar como ejemplo:
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
donde n
está 2 ^ n segundos. Entonces, un valor de '6' tenía un TTL de aproximadamente 1 minuto. Un valor de '12' tenía un TTL de aproximadamente 1 hora. '15' fue alrededor de 8 horas y así sucesivamente. Permitió que un byte definiera el tiempo de espera y le diera suficiente control por períodos cortos o largos.