Tu tarea es generar un solo número; El número de semanas ISO que un intervalo de fechas determinado se cruza. Para citar Wikipedia: An average year is exactly 52.1775 weeks long
pero no se trata del promedio.
La entrada consta de dos fechas ISO separadas por espacios:
0047-12-24 2013-06-01
La fecha de finalización nunca es anterior a la fecha de inicio. Utilizaremos el calendario gregoriano extrapolado por simplicidad.
Casos de prueba:
Format: input -> output
2015-12-31 2016-01-01 -> 1 (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2 (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1 (this single day is of course within a single week)
Su solución debe manejar fechas entre 0001-01-01
y 9999-12-31
.
Weeks start with Monday.
Respuestas:
Ruby,
898886 bytesUna solución muy primitiva: dada la primera fecha
a
y la segunda fechab
, el incrementoa
, cheque si es un lunes (si es así, que hemos "dio la vuelta" a una nueva semana), y para una vez quea
esb
.Toma entrada en el formato exacto especificado en la pregunta: una sola cadena separada por espacios. (La forma en que analiza la entrada es elegante: utiliza el operador "splat" de Ruby
*
. Este operador "expande" una matriz o enumerable, por lo que seTime.gm *[2013, 06, 01]
convierteTime.gm 2013, 06, 01
).Importado de una discusión de comentarios:
Solo para evitar futuras confusiones sobre si esto maneja los límites de año correctamente acuerdo con Wikipedia , todas las semanas siempre comienzan el lunes y terminan el domingo.
Para algunos trucos más elegantes, todos son equivalentes:
fuente
a==b
pora<b
?VBA, 125 bytes
Esperando 2 entradas de función como cadenas
Estoy bastante seguro de que esto se puede jugar al golf. Esto se repite todos los días entre las 2 fechas e incrementa el contador cada vez que cambia la fecha ISO.
DatePart("ww",f+i,2,2)
es el número de semana ISO en VBA los primeros 2 significaMonday (complies with ISO standard 8601, section 3.17)
. entonces segundo 2 significaWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)
140 bytes con entrada única
fuente
R, 76 bytes
Después de la conversación con @Doorknob, finalmente es tan fácil como contar los lunes.
seq
permite crear un vector de fechas (de cada día entre dos fechas) y el tiempo de trabajo lo transforma en el 'número del día de la semana', ahora cuenta las veces que es 1 para obtener el número de veces que cambiaste la semana y agrega 1 a Tener en cuenta la semana anterior.Otro enfoque de bucle:
R, 85 bytes
fuente
Mathematica
135 79 96 8474 bytesDe acuerdo con la sugerencia de @ Doorknob, esto
genera todas las fechas en el rango
cuenta el número de lunes (
ISOWeekDay
== "1") enDateRange
(excluyendod
), yse suma
1
al total.fuente