Una fecha puede ser representada por un entero sin signo como tal: AAAAMMDD. Lo que debe hacer es escribir el programa o la función más corta que calcule la fecha más reciente cuyo número era divisible por un número determinado n
(incluida la fecha de hoy) y luego devuelve esa fecha en el formato que se muestra arriba. Si nunca ha habido una fecha (entre 00000101 y hoy inclusive) divisible por el entero dado, debe devolver -1.
Ejemplos
Current Date Input Output
30 July, 2014 4 20140728
30 July, 2014 7 20140729
28 July, 2014 4 20140728
28 July, 2014 7 20140722
28 July, 5 90000 -1
Entrada
Puede leer desde STDIN o tomar un argumento de función o incluso esperar que la entrada se almacene en una variable. La entrada será un entero sin signo.
Salida
Escriba en STDOUT o devuelva (o guarde en una variable) el número entero que representa la fecha en el formato AAAAMMDD.
Restricciones
Puede usar cualquier biblioteca estándar que ofrezca su idioma. Se aplican lagunas estándar .
Condiciones ganadoras
Este es un código de golf , por lo que gana el programa más pequeño (en bytes). En caso de empate, la respuesta con más votos gana.
Respuestas:
Mathematica,
9360 bytesEspera que la entrada se almacene en
n
.Tenga en cuenta que la línea vertical
∣
es el carácter unicode para "divide", que he contado como 3 bytes (UTF-8).Editar: se encontró un buen truco para evitar la hinchazón
DateString
y la especificación de formato :).Editar: Olvidé por completo el
-1
requisito. Corregido ahora.Aquí hay una explicación
Tenga en cuenta que he usado en
|
lugar de∣
en la explicación, porque el Unicode se mete con el monoespacio.fuente
Python 2 - 150
Gracias @ chill0r por la sugerencia de eliminar days =, y Jason S por la sugerencia de que el bloque try se puede reducir a una línea.
fuente
days=
ent-=d.timedelta(days=1)
. Esto también funciona bien (al menos en python3)int(t.strftime("%Y%m%d"))
y soltarre
, (2) usar una líneatry
porque solot-=d.timedelta(1)
necesita estar en ella.strftime
en fechas anteriores funciona en python3, comprobado y obtengo un error en python2C # 136
Con las especificaciones revisadas, una función que toma un int sin signo y devuelve un int.
152 caracteres con entrada / salida variable
Aprovechando los requisitos de entrada / salida sueltos, la entrada debe almacenarse en la variable
n
(actualmente cuenta todos los caracteres excepto el literal entero), y la salida se proporciona con la variables
.204 caracteres con STDIN / STDOUT:
fuente
T-SQL (2012) - 148
Asume que hay una variable libre @n con el valor n.
fuente
Golflua
9086Una versión de Lua sin golf sería:
fuente
MATLAB: 61
Asume que el divisor está almacenado en
n
. El resultado se almacenará en una variable llamadaans
.Versión comentada:
Generará un error si no se encuentra ningún resultado, pero la respuesta aún está disponible en la variable a pesar de eso.
El error podría evitarse a costa de 2 caracteres adicionales:
fuente
PHP (92 = 85 + 7)
Espera que la entrada se almacene en
$n
.Acabo de recordar por qué ya no me gusta PHP =)
EDITAR: Ahora también se implementa el -1 de las especificaciones.
fuente
JavaScript (ES6) 115
Espera número en la variable n, resultado almacenado en la variable r. Cada día se verifica, comenzando con la fecha actual y disminuyendo, debe haber una mejor manera.
Además, utilizando las funciones de fecha estándar de javascript, todas las fechas son gregorianas hasta el año 1 (con los años bisiestos, en consecuencia, incorrectos antes de la reforma gregoriana).
fuente
C # - 144 (o 124 en LINQPad) + 1 por cada dígito en
n
Esto espera que la entrada esté en la variable
n
. Al final de la ejecución, el valor deseado estará en la variabler
. Sin00010101
embargo, esto se considera como la primera fecha, porque la fecha00000101
no existe. Las sugerencias de mejora son siempre bienvenidas.Versión de LINQPad:
fuente
Groovy -
301300 caracteresMuy simple (y lento), sin trucos para ocultar el hecho de que usa Joda Time.
Golfizado:
Ejecución de ejemplo (30/07/2014):
Sin golf:
fuente
R,
146139Buena suerte con una cita que no funciona.
microbenchmark
informa que tarda aproximadamente medio segundo en retroceder 15 días. Al 31 de julio de 2014, esto tomará alrededor de 20 millones de segundos (~ 23 días) para escupir-1
, al menos de acuerdo con el reverso del sobre.editar : algunos atajos en los comentarios
fuente
!d
es más corto qued==F
y!z%%n
quez%%n==0
. Además, convertiras.numeric(gsub("-","",...)
una función también debería reducir el recuento de caracteres. Aún así, buen trabajo!as.real
es a menudo una buena alternativa más cortaas.numeric
.as.real
está extinto a partir de R 3.0.0. Pero todavía tenemosas.double
cuál es un personaje más corto.paste0
en mi.Rprofile
naturalmente :)Matlab 104
Sin golf:
EDITAR: logré optimizarlo un poco, pero @DennisJaheruddin tiene la solución real aquí
fuente
-1,for s=str2num(datestr(1:now,'YYYYmmDD'))',if~mod(s,n),+s,end,end
Python 3 -
151148 bytes, generadoresGracias @ nyuszika7h por su
import*
sugerenciafuente
Ruby 103
Entrada
Espera que el valor del divisor esté presente en la variable
n
.Salida
El valor de retorno de la
f
función.Ejemplo en línea: http://ideone.com/LoYxG4
fuente
Java: 373 caracteres
Este es un puerto de la respuesta Groovy, y utiliza Joda Time.
Golfizado:
Ejecuciones de muestra (con joda-time-2.4.jar en classpath:
Sin golf:
fuente
java.time.*
en la última versión de Java.Bash + coreutils (8.21), 67 bytes
seq
genera enteros del 1 al 9 9 , uno por línea, y lo formatea como-<x>day
date -f
que interpreta cada línea y genera la fecha formateada en unadc
expresión como[pq] sp [_1pq] sq 20140728 d A1 =q d 7% 0=p
(espacios añadidos para facilitar la lectura)[pq]
defina una macro para imprimir la parte superior de la pila, luego salgasp
guardar macro en el registro p[pq]
defina una macro para presionar -1, imprima la parte superior de la pila y salgasq
guardar macro en el registro q20140728
entero de fecha incrustadod
duplicar la parte superior de la pilaA1
empuje 101 (00000101)=q
pop valores de la pila superior 2: compare la fecha y 101, y llame a macroq
si es igual7
divisor de empuje%
divisor de pop y dividee, el divide y empuja el resto0
empuje 0=p
pop valores de la pila superior 2: compare el resto y 0, y llame a macrop
si es iguald
duplicar la parte superior de la pilap
se llama macro : imprime el entero de la fecha y se cierra pordc
completodc
las expresiones se canalizandc
para su evaluación. Una vez quedc
imprime el valor correcto y se cierra, el resto de la tubería se derribaSalida:
Dado que este programa genera números enteros del 1 al 9 9 , será válido hasta poco más de 1 millón de años en el futuro. Espero que esta limitación sea aceptable ;-)
Gracias @ WumpusQ.Wumbley por acortar el retorno de -1.
fuente
|grep .||echo -1
hasta el final de la tubería, o el uso zsh donde se puede expansiones nido comoecho ${$(cmd):-1}
(esto le costará una barra invertida en otro lugar ...)sizeof time_t
problema, ya que el límite donde se rompe es 2 ** 31 segundos antes del 1/1/1970. Mi instalación anterior también es patéticamente de 32 bitsPITÓN: 134 bytes
No voy a poder vencer al líder actual, y no es mucho mejor que la mejor respuesta de Python, pero decidí publicar mi mejor solución de Python.
Sin golf:
fuente
from datetime import*
lugar deimport datetime as d
, entimedelta(1)
lugar ded.timedelta(1)
y enyield
lugar dereturn
.JavaScript (ES5) - 94
Espera la entrada en variable
x
y coloca la salida eno
.fuente
k4
(84)(73)Esto es solo un corte inicial con el primer algoritmo que vino a la mente; Estoy seguro de que es mejor tanto en rendimiento como en longitud.
Esta versión codifica la parte "hoy" (esa es la
.z.D
); cámbielo a un literal de fecha (yyyy.mm.dd
) o un entero en el sistema de fechas q (días desde el 1 de enero de 2000) para ejecutar los casos de prueba. (q no analizará los literales de fechas anteriores a principios del siglo XVIII, por lo que para las fechas anteriores, deberá calcular el valor y usar el entero apropiado directamente. El 1 de enero, "AD 0", de la especificación, se convierte fuera de ser-730457
, que se utiliza en el código de función. 28 de julio, AD 5, desde el último caso de prueba, resulta ser-728450
.)Los casos de prueba dados:
editar:
Este es un enfoque diferente que utiliza uno de los operadores de convergencia para disminuir la fecha hasta que encuentre una divisible o cruce el límite de 1/1/0000. También realiza la conversión de fecha a entero de forma ligeramente diferente.
Los casos de prueba, esta vez de una vez:
fuente
VBA 343 bytes (módulo)
fuente
Sub d(i):a=Now:b=a:Do Until b/i=Int(b/i):a=DateAdd("d",-1,a):b=Format(a,"yyyymmdd"):If b="01000101"Then:b=-1:Exit Sub:Loop:Debug.?b:End Sub
139 BytesPowerShell - 76
Esto depende del número que se almacena en la variable
$n
.fuente