Mis vacaciones PPCG terminaron: D
Introducción
El tiempo fraccional es the year + (the value (minute of year) / number of minutes in the year)
.
Ejemplo de cálculo
Debe suponer que febrero siempre tiene 28 días y que el año siempre tiene 365 días.
Digamos que queremos convertir el tiempo: 17:34 3rd March 2013
en tiempo fraccionario. En primer lugar, encuentra cuántos minutos había en 2013: 525600 minutos . Llamemos esto x
.
A continuación, desea averiguar cuántos minutos han pasado desde principios de 2013. Algunos cálculos rápidos le indicarán que la respuesta es 88894 minutos:
Han pasado 61 días desde el comienzo del año, que multiplicado por 1440 (número de minutos en un día) equivale a 87840 minutos. En 17 horas son 1020 minutos (17 * 60). Ahora, podemos agregar 87840, 1020 y 34 minutos para igualar 88894 minutos.
Llamemos esto y
.
Finalmente, divides y
por x
y sumas el año, resultando en 2013.16912
(hasta 5 decimales).
Entrada
La fecha y la hora se darán como una sola cadena. La cadena tendrá el siguiente formato:
YYYY-MM-DD hh:mm
El tiempo siempre estará en formato de 24 horas y el año siempre estará en el rango 1900-2050 inclusive.
Ejemplos
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
Si va por la recompensa, hágame ping en los comentarios o en The Nineteenth Byte .
Desafío
Calcule la fecha y hora dadas como un año fraccionario.
Dé toda la salida a cinco decimales (puede redondear de la forma que desee: piso, techo o redondeo verdadero). El código más corto gana.
Generosidad
Estoy ofreciendo una recompensa de 100 repeticiones por el programa más corto que también acepta la fecha en formato de año fraccionario y devuelve la hora en YYYY-MM-DD hh:mm
formato. En esencia, su programa (o función) tiene que actuar de la siguiente manera:
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.
, pero también... using the Gregorian calendar.
Respuestas:
TSQL, 63 bytes
Esta es una versión más corta que mi respuesta original, porque mi primera respuesta incluía el cálculo para el año bisiesto.
Violín
El siguiente sql puede manejar ambos tipos de entrada
TSQL, 154 bytes
Violín combinado 1
Violín combinado 2
fuente
JavaScript (ES6), 84 bytes
Suponiendo que no se requieren años bisiestos o DST, reemplazo el año con 1970, lo que hace
Date.parse
que devuelva directamente la compensación de tiempo en milisegundos, que hubo31536000000
en 1970 (o de hecho, cualquier otro año no bisiesto). Todo lo que necesito hacer es volver a agregar el año y redondear a 5 decimales. Editar: conversión bidireccional en183178 bytes:Asume que las cadenas que contienen un
:
formato de hora se manejan como se indica arriba, de lo contrario se quita el año, se convierte a milisegundos, se agrega medio minuto para redondear, se convierte a una fecha en 1970, se extrae el mes, el día, la hora y los minutos, y se prefieren los año originalfuente
s
es el argumento de la función.Matlab,
132115bytesRedondea hacia 0.
Hmmm ... eso es bastante largo.
Eso está usando algunos componentes incorporados, pero no los realmente útiles, debido a los años bisiestos.
Analizar la cadena directamente da 2 bytes más de solución:
Las versiones más recientes de Matlab probablemente tengan una mejor función de división, pero estoy ejecutando en 2012a.
Algunos bytes guardados gracias a @Luis Mendo
fuente
[-1 '# #"#"##"#"'-4]
para guardar algunos bytes. ¿Sonyear
las funciones estándar etc.? Si está utilizando una caja de herramientas, debe indicarla en el título, por ejemplo, "Matlab with Financial Toolbox"#
notación y nunca la encontré. ¿Dónde puedo leer más al respecto (la búsqueda rápida en Google no ayudó)? Creo queyear
etc. son funciones estándar, pero no sé si se comportan igual fuera de la caja de herramientas (docs) .PowerShell v3 +, 131 bytes
Toma información
$args[0]
y la convierteGet-Date
para almacenar en[datetime]
formato .NET , almacena en$t
. Calcula si existe el 29 de febrero y establece,$a
por lo que restamos el valor de minutos de esa fecha (si está presente).Luego usamos el
-f
operador ormat con una especificación de cadena fija de 5 dígitos decimales para ejecutar el cálculo. Utiliza funciones integradas para calcular el.DayOfYear
y el.TotalMinutes
de la entrada dada, restar$a
si es un año bisiesto, dividir por525600
minutos en total y agregar la entrada.Year
.Se quejará (verbosamente) a STDERR si el 29 de febrero no existe (ver ejemplos a continuación), pero dado que STDERR es ignorado por defecto, no nos preocupamos por eso. Además, tenga en cuenta que PowerShell realiza el redondeo bancario por defecto.
Ejemplos
Alternativamente, con años bisiestos, 119 bytes
Si seguimos la configuración del calendario, podemos reducir una docena de bytes porque no necesitaremos tener en cuenta
$a
en el código original anterior. Esto nos permite pasar$t
a la expresión en sí, y calcularemos explícitamente el.DayOfYear
31 de diciembre. De lo contrario, sigue la misma metodología.fuente
Python 3,
163173 bytesmás bytes debido al formato de salida
no utiliza ninguna fecha incorporada, como la respuesta de Java.
un poco más legible
fuente
Perl 6 ,
107105102bytesExplicación:
Prueba:
fuente