Inspirado en un escenario de la vida real, al que he pedido una respuesta aquí: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- aparece en un conjunto de fechas
Dada una serie de intervalos de tiempo (o pares de fecha de inicio-fin), genera un recuento de cuántos intervalos de tiempo cubren cada día, para todos los días en el rango total.
Por ejemplo:
# Start End
1 2001-01-01 2001-01-01
2 2001-01-01 2001-01-03
3 2001-01-01 2001-01-02
4 2001-01-03 2001-01-03
5 2001-01-05 2001-01-05
Dados los datos anteriores, los resultados deberían ser los siguientes:
2001-01-01: 3 (Records 1,2,3)
2001-01-02: 2 (Records 2,3)
2001-01-03: 2 (Records 2,4)
2001-01-04: 0
2001-01-05: 1 (Record 5)
Solo necesita generar los recuentos de cada día (en orden, ordenados más antiguo-más nuevo); no en qué registros aparecen.
Puede suponer que cada intervalo de tiempo solo contiene fechas, no horarios; y así días completos siempre están representados.
I / O
La entrada puede ser cualquier formato que represente un conjunto de intervalos de tiempo, por lo que puede ser un conjunto de pares de tiempos o una colección de objetos (incorporados) que contienen fechas de inicio y finalización. Las fechas y horas están limitadas entre 1901 y 2099, como es normal para los desafíos de PPCG.
Puede suponer que la entrada está ordenada previamente como desee (especifique en su respuesta). Las fechas de entrada son inclusivas (por lo que el rango incluye la totalidad de las fechas de inicio y finalización).
También puede suponer que, de las dos fechas en cualquier rango dado, la primera será más antigua o igual a la segunda (es decir, no tendrá un rango de fechas negativo).
La salida es una matriz que contiene el recuento de cada día, desde el más antiguo hasta el más nuevo en la entrada cuando se ordena por Fecha de inicio.
Entonces, la salida para el ejemplo anterior sería {3,2,2,0,1}
Es posible que algunos días no se incluyan en ningún intervalo de tiempo, en cuyo caso 0
se emite para esa fecha.
Criterios ganadores
Este es el código de golf, por lo que gana los bytes más bajos. Se aplican exclusiones habituales.
Ejemplo de pseudo algoritmo
For each time range in input
If start is older than current oldest, update current oldest
If end is newer than current newest, update current newest
End For
For each day in range oldest..newest
For each time range
If timerange contains day
add 1 to count for day
End For
Output count array
Otros algoritmos para llegar al mismo resultado están bien.
0
debería estar en un diccionario? Solo parece forzar al usuario a iterar de min(input)
a max(input)
, lo que no parece agregar nada al núcleo del desafío (tiempos de cálculo).