Meu feriado de PPCG acabou: D
Introdução
O tempo fracionário é the year + (the value (minute of year) / number of minutes in the year)
.
Exemplo de cálculo
Você deve assumir que fevereiro sempre tem 28 dias e o ano sempre tem 365 dias.
Digamos que queremos converter o tempo: 17:34 3rd March 2013
em tempo fracionário. Em primeiro lugar, você encontra quantos minutos houve em 2013: 525600 minutos . Vamos chamar assim x
.
Em seguida, você deseja descobrir quantos minutos existem desde o início de 2013. Alguns cálculos rápidos indicam que a resposta é 88894 minutos:
Houve 61 dias desde o início do ano, que vezes 1440 (número de minutos em um dia) é igual a 87840 minutos. Em 17 horas são 1020 minutos (17 * 60). Agora, podemos adicionar 87840, 1020 e 34 minutos para equivaler a 88894 minutos.
Vamos chamar assim y
.
Finalmente, você dividir y
por x
e adicione o ano, resultando em 2013.16912
(a 5 casas decimais).
Entrada
A data e a hora serão fornecidas como uma única sequência. A sequência estará no seguinte formato:
YYYY-MM-DD hh:mm
O horário sempre estará no formato de 24 horas e o ano sempre estará no intervalo de 1900-2050, inclusive.
Exemplos
Input: 2016-08-06 23:48
Output: 2016.59723
Input: 2013-03-03 17:34
Output: 2013.16912
Input: 1914-11-11 11:11
Output: 1914.86155
Se você está indo para a recompensa, faça ping nos comentários ou no The XIX XIX Byte .
Desafio
Calcule a data e hora especificadas como um ano fracionário.
Forneça toda a saída com cinco casas decimais (você pode arredondar da maneira que desejar: piso, teto ou arredondamento verdadeiro). O menor código vence.
Recompensa
Estou oferecendo uma recompensa de 100 repetições para o programa mais curto, que também aceita a data no formato de ano fracionário e retorna a hora no YYYY-MM-DD hh:mm
formato. Em essência, seu programa (ou função) deve agir da seguinte maneira:
f('1914-11-11 11:11') => 1914.86155
f('1914.86155') => 1914-11-11 11:11
For this, assume February has 28 days and the year is 365 days long.
, mas também... using the Gregorian calendar.
Respostas:
TSQL, 63 bytes
Esta é uma versão mais curta que a minha resposta original, porque minha primeira resposta incluiu cálculo para o ano bissexto.
Violino
O sql a seguir pode manipular os dois tipos de entrada
TSQL, 154 bytes
Fiddle combinado 1
Violino combinado 2
fonte
JavaScript (ES6), 84 bytes
Supondo que não sejam necessários anos bissextos ou horário de verão, substituo o ano por 1970, que
Date.parse
retorna diretamente o deslocamento de tempo em milissegundos, dos quais houve31536000000
em 1970 (ou qualquer outro ano sem bissexto). Tudo o que preciso fazer é adicionar novamente o ano e arredondar para 5 casas decimais. Editar: conversão bidirecional em183178 bytes:Supõe que as seqüências contendo um
:
formato de hora são, tratadas como acima, retira o ano, converte em milissegundos, adiciona meio minuto para fins de arredondamento, converte para uma data em 1970, extrai o mês, dia, hora e minuto e prefixa o ano original.fonte
s
é o argumento para a função.Matlab,
132115 bytesArredonda para 0.
Hmmm ... isso é muito longo.
Isso está usando alguns componentes internos, mas não os realmente úteis - por causa dos anos bissextos.
A análise direta da string fornece mais 2 bytes de solução:
As versões mais recentes do Matlab provavelmente têm uma função de divisão melhor, mas estou executando em 2012a.
Alguns bytes salvos graças ao @Luis Mendo
fonte
[-1 '# #"#"##"#"'-4]
para salvar alguns bytes. Sãoyear
etc funções padrão? Se você estiver usando uma caixa de ferramentas, indique-a no título, por exemplo "Matlab with Financial Toolbox"#
anotação e nunca a encontrei. Onde posso ler mais sobre isso (a pesquisa rápida no Google não ajudou)? Eu acho que osyear
etc. são funções padrão, mas não sei se eles se comportam da mesma maneira fora da caixa de ferramentas (documentos) .PowerShell v3 +, 131 bytes
Pega entrada
$args[0]
e converte-aGet-Date
para armazenar em[datetime]
formato .NET , armazena em$t
. Calcula se existe 29 de fevereiro e define,$a
para subtrairmos o valor de minutos dessa data (se houver).Em seguida, usamos o
-f
operador ormat com uma especificação de cadeia fixa de 5 dígitos decimais para executar o cálculo. Usos built-ins para calcular a.DayOfYear
ea.TotalMinutes
da entrada dada, subtrair$a
se é um ano bissexto, divida por525600
minutos no total, e adicionar a entrada.Year
.Irá reclamar (verbalmente) ao STDERR se 29 de fevereiro não existir (veja os exemplos abaixo), mas como o STDERR é ignorado por padrão, não nos preocupamos com isso. Além disso, observe que o PowerShell faz o arredondamento do banqueiro por padrão.
Exemplos
Como alternativa, com anos bissextos, 119 bytes
Se seguirmos as configurações da agenda, podemos cortar uma dúzia de bytes, porque não precisaremos levar em consideração
$a
o código original acima. Isso nos permite passar$t
para a própria expressão, e calcularemos explicitamente o valor.DayOfYear
para 31 de dezembro. Caso contrário, segue a mesma metodologia.fonte
Python 3,
163173 bytesmais bytes por causa do formato de saída
não usa data incorporada, como a resposta em java.
um pouco mais legível
fonte
Perl 6 ,
107 105102 bytesExplicação:
Teste:
fonte