Introdução
O tempo é confuso. Sessenta segundos a um minuto, sessenta minutos a uma hora, vinte e quatro horas por dia (e para não mencionar essa manhã am / pm!).
Atualmente, não há espaço para essa tolice, por isso decidimos adotar a única alternativa sensata: dias decimais! Ou seja, cada dia é considerado 1 unidade inteira e qualquer coisa mais curta é escrita como uma fração decimal desse dia. Assim, por exemplo: "12:00:00" seria escrito como "0,5" e "01:23:45" poderia ser escrito como "0,058159".
Como levará tempo para se acostumar com o novo sistema, você terá a tarefa de escrever um programa que possa ser convertido entre eles nas duas direções.
Desafio
Escreva um programa no idioma de sua escolha que, dado um tempo moderno no formato ISO-8601 de "hh: mm: ss", retorne a unidade de fração decimal equivalente. Da mesma forma, dada uma fração decimal, o programa deve retornar o tempo no formato moderno especificado inicialmente.
Você pode fazer as seguintes suposições:
- A entrada e saída de tempo modernos podem variar de "00:00:00" a "24:00:00"
- A entrada e saída de tempo decimal podem variar de "0" a "1" e devem poder aceitar / produzir até pelo menos 5 casas decimais (como "0,12345"). Mais precisão é aceitável
- O programa deve saber qual direção de conversão executar com base na entrada
- Você não pode usar funções / bibliotecas relacionadas ao tempo
O vencedor será determinado pelo código mais curto que atender aos critérios. Eles serão selecionados em pelo menos 7 unidades de dia decimal, ou se / quando houver envios suficientes.
Exemplos
Aqui está um (n intencionalmente) trecho de código JavaScript mal escrito para ser usado como exemplo:
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
onde n
está a 2 ^ n segundos. Portanto, um valor de '6' tinha um TTL de cerca de 1 minuto. Um valor de '12' tinha um TTL de cerca de 1 hora. '15' durou cerca de 8 horas e assim por diante. Ele permitiu que um byte definisse o tempo limite e lhe desse controle suficiente por períodos curtos ou longos.