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
fonte
n
onden
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.Respostas:
CJam,
58 5642 bytesTenho certeza que isso é muito longo e pode ser jogado muito. Mas aqui vai para iniciantes:
Experimente online aqui
fonte
86400q':/:d_,({60bd\/}{~*mo60bAfmd2/':*}?
:, estou excluindo minha resposta. Amo
é para que 0.058159 convertidos para 01:23:45Python 2,
159150141 + 2 = 143 bytesSolução simples, provavelmente pode ser muito mais curta. Vai trabalhar nisso.
Foram adicionados dois bytes para considerar a entrada que precisa ser incluída em "s. Além disso, o Sp3000 apontou um problema com a interpretação de octais de eval () e mostrou uma maneira de reduzir a formatação, usar map () e remover uma impressão.
Confira em ideone aqui.
fonte
Javascript ( ES6 ),
116110 bytesComentado:
fonte
24:00:00
O resultado é1
o inverso, mas o inverso não é verdadeiroPython 3: 143 bytes
Contagem de mesmos bytes que a solução python 2, mas parece que adotamos abordagens diferentes para a matemática.
fonte
Julia,
152143142 bytesBem, atualizei minha abordagem para ser menos "juliana", como se costuma dizer, em prol do golfe. Para uma abordagem melhor (embora menos concisa), consulte o histórico de revisões.
Isso cria uma função sem nome que aceita uma sequência de caracteres ou um número de ponto flutuante de 64 bits e retorna um número ou sequência de ponto flutuante de 64 bits, respectivamente. Para chamá-lo, dê um nome, por exemplo
f=x->...
.Ungolfed + explicação:
Exemplos:
fonte
C, 137 bytes
Programa C completo. Aceita stdin e produz stdout.
Ungolfed e comentou:
fonte
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
fonte
Javascript,
194192190188 bytesfonte
JavaScript ES6,
98130 bytesfonte
C,
156152 bytesEu pensei que seria fácil para C. Mas ainda acabou bem grande. :(
Programa de teste:
Resultado:
fonte
PHP,
7069 bytesrecebe entrada do argumento da linha de comando, imprime em STDOUT:
Se a entrada contiver dois pontos, converta para hora unix e divida por (segundos por dia), caso
contrário , multiplique o valor numérico por (segundos por dia) e formate a hora unix para
hh:mm:ss
.fonte
Perl,
109108101 + 6 (-plaF:
sinalizador) = 107 bytesUsando:
Experimente em Ideone.
fonte
Excel, 178 bytes
fonte