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
fuente
n
donden
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.Respuestas:
CJam,
58 5642 bytesEstoy seguro de que esto es demasiado largo y se puede jugar mucho al golf. Pero aquí va para empezar:
Pruébalo en línea aquí
fuente
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
estoy borrando mi respuesta. Elmo
es para que 0.058159 se convierta a 01:23:45Python 2,
159150141 + 2 = 143 BytesSolución directa, probablemente puede ser mucho más corta. Trabajaré en ello.
Se agregaron dos bytes para tener en cuenta la entrada que debe incluirse en "s". Además, Sp3000 señaló un problema con la evaluación de los octales de evaluación (), y mostró una forma de acortar el formato, usar map () y eliminar una impresión.
Échale un vistazo a ideone aquí.
fuente
Javascript ( ES6 ),
116110 bytesComentado:
fuente
24:00:00
produce1
pero lo inverso no es ciertoPython 3: 143 bytes
El mismo número de bytes que la solución de Python 2, pero parece que tomamos diferentes enfoques para las matemáticas.
fuente
Julia,
152143142 bytesBueno, actualicé mi enfoque para ser menos "juliano", como dicen, por el bien del golf. Para un enfoque mejor (aunque menos conciso), consulte el historial de revisiones.
Esto crea una función sin nombre que acepta una cadena o un número de coma flotante de 64 bits y devuelve un número o cadena de coma flotante de 64 bits, respectivamente. Para llamarlo, asígnele un nombre, por ejemplo
f=x->...
.Ungolfed + explicación:
Ejemplos:
fuente
C, 137 bytes
Programa completo C. Toma entrada en stdin y salidas en stdout.
Ungolfed y comentó:
fuente
J, 85 bytes
Resultados:
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
fuente
Javascript,
194192190188 bytesfuente
JavaScript ES6,
98130 bytesfuente
C,
156152 bytesPensé que iba a ser fácil para C. Pero aún así terminó siendo bastante grande. :(
Programa de prueba:
Salida:
fuente
PHP,
7069 bytestoma la entrada del argumento de la línea de comando, imprime en STDOUT:
Si la entrada contiene dos puntos, conviértala en tiempo de Unix y divídala entre (segundos por día); de lo
contrario , multiplique el valor numérico con (segundos por día) y formatee el tiempo de Unix en
hh:mm:ss
.fuente
Perl,
109108101 + 6 (-plaF:
flag) = 107 bytesUtilizando:
Pruébalo en Ideone.
fuente
Excel, 178 bytes
fuente