Encuentre la fecha más cercana a un TargetDate para un día de la semana determinado.
Por ejemplo, dada una fecha 20161219
y un día de la semana de Friday (6)
, la respuesta es 20161216
.
Otro ejemplo, dada una fecha 20161219
y un día de la semana de Wednesday (4)
, la respuesta es 20161221
.
Un último ejemplo, dada una fecha 20161219
y un día de la semana de Monday (2)
, la respuesta es 20161219
.
Reglas:
- El formato de fecha para la entrada y salida debe coincidir. En los ejemplos, usé
yyyymmdd
, pero puede usar cualquier formato siempre que el año (al menos dos dígitos), el mes y el día del mes sean "legibles por humanos". - El día de la semana se ingresa como un entero. En mi ejemplo, el domingo es el primer día de la semana, por lo tanto, es el número del día de la semana
1
. Puede tener cualquier numeración del Día de la semana, siempre y cuando la anote cuando difiera del ejemplo. - Los años 1970 a 2030 deben ser acomodados.
- Se permiten herramientas y bibliotecas de fechas de idiomas comunes, pero se otorga credibilidad callejera a aquellos que eligen no usarlas.
- El menor número de bytes gana.
Respuestas:
Perl 6 , 46 bytes
Una lambda que acepta dos argumentos: una cadena de fecha en
yyyy-mm-dd
formato y un número entre semana1
= lunes y7
= domingo.Explicación:
Usando el formato de fecha y día de la semana utilizado en los ejemplos, sería 88 bytes:
fuente
Perl 6 , 83 bytes
Intentalo
Expandido
fuente
JavaScript (ES6), 93 bytes
Utiliza
%Y-%m-%d
formato de fecha. Si%a %b %d %Y
es un formato de fecha aceptable, entonces para 82 bytes:Podría guardar otros 2 bytes al requerir Sunday = 10 to Saturday = 16, pero ese es un tonto mapeo de días de la semana. Versión anterior de
141141 bytes (gracias a @Guedes) que usaba el formato de fecha AAAAMMDD específico, con su explicación:Esto se siente demasiado tiempo. Explicación: Primero, inserta
-
s en la fecha para obtener el formato ISO quenew Date
luego puede analizar. Luego, compara el día deseado con el día real para obtener un valor entre-3
y3
para el desplazamiento real. La magia9
proviene de7
(porque%
es un módulo de CPU, no es un módulo verdadero) más3
(para el-3
desplazamiento) menos1
(porquen
está indexado en 1 ygetDay
está indexado en 0). La fecha se convierte de nuevo al formato ISO y se eliminan los caracteres no deseados.fuente
.replace(/(?=..(..)?$)/g,'-')
Python,
150149 bytesOouuf, 149. repl.it
Función sin nombre que toma una cadena
s
, la fecha como se especifica (utilizando cadena de formatot='%Y%m%d'
para la entrada y salida) y un número en [1,7],n
.Inspecciona los siete días a partir de los tres días anteriores a los tres días posteriores a la fecha solicitada.
La semana
datetime
comienza el lunes y se basa en cero, por lo que la prueba es(n-2)%7==d.weekday()
.fuente
Bash + coreutils, 50
Pruébalo en línea .
date -d$1 +%u
da el día de la semana (1..7); 1 es lunes3 + 7 - 1
. El 3 ajusta el rango de entrada para el rango [-3, 3], y se resta nuevamente después del módulo. Se requiere el 7 porque el módulo bash es el mismo que el módulo de la CPU y puede dar resultados de -ve, agregando 7 ajustes en el rango correcto. El -1 se debe a que en la entrada, 1 es domingo, pero con la salida% u, 1 es lunes.date
luego lo analiza<input date> + <magic factor>days
y lo presenta en el formato AAAAMMDD.fuente
Lenguaje de macros SAS, 110 bytes
Un lenguaje de golf terrible pero aquí está la explicación (de adentro hacia afuera):
Cree una macro
s
que acepte una entrada de fechad
y un día laborable numéricoa
. Luego%eval(%sysfunc(putn(&d,8.))-4)
convierte la fecha en una fecha numérica SAS y la disminuye en 4 días. Laintnx
función devuelve la siguiente aparición del día de la semana especificado.putn
luego formatea la fecha de nuevo a aaaammdd e%put
imprime la salida en el registro.fuente
Mathematica,
8549 bytesEl formato de entrada para las fechas es una lista
{2016, 12, 16}
o realDateObject
(creo que algunas otras funcionan también, pero las he probado). En cualquier caso, el formato de salida coincidirá automáticamente. La numeración del día comienza los1
lunes.La idea es calcular la diferencia entre el día de la semana de entrada y el día de la semana de destino con
#2-#~DateValue~"ISOWeekDay"
y luego asignarlo[-3, 3]
usando un módulo con desplazamiento (es decirMod[...,7,-3]
). El resultado simplemente se agrega a la fecha de entrada (la unidad predeterminada para la adición de objetos de fecha es días).fuente
R,
119 7756 bytesFunción sin nombre que toma dos entradas, la fecha
D
(cadena) y el díad
(numérico).Utiliza la función
wday()
dellubridate
paquete. Puede convertir convenientementeDate
objetos en días de la semana con1
un tratamiento predeterminado como domingo.Editar: E / S ahora es el valor predeterminado de la
as.Date()
función:"YYYY-mm-dd"
Sin golf y explicado
Editar: ahora crea una secuencia de
+-3
días en los que se garantiza que cualquier día de la semana se encuentre. Posteriormente, solo tenemos que coincidir un día, lo que hizo que el problema fuera mucho más fácil.fuente