Inspiré d'un scénario réel, auquel j'ai demandé une réponse ici: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- apparaît dans un ensemble de dates
Étant donné un tableau d'intervalles de temps (ou de paires startdate-enddate), affichez un nombre de périodes couvrant chaque jour, pour tous les jours de la plage totale.
Par exemple:
# 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
Compte tenu des données ci-dessus, les résultats devraient être les suivants:
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)
Vous avez seulement besoin de sortir les comptes pour chaque jour (dans l'ordre, triés du plus ancien au plus récent); pas dans quels enregistrements ils apparaissent.
Vous pouvez supposer que chaque intervalle de temps contient uniquement des dates, pas des heures; et ainsi des jours entiers sont toujours représentés.
E / S
L'entrée peut être n'importe quel format représentant un ensemble d'intervalles de temps - donc soit un ensemble de paires d'heures, soit une collection d'objets (intégrés) contenant des dates de début et de fin. Les dates-heures sont limitées entre 1901 et 2099, comme c'est normal pour les défis PPCG.
Vous pouvez supposer que l'entrée est pré-triée comme vous le souhaitez (spécifiez dans votre réponse). Les dates d'entrée sont inclusives (donc la plage comprend l'ensemble des dates de début et de fin).
Vous pouvez également supposer que, parmi les deux dates d'une plage donnée, la première sera plus ancienne ou égale à la seconde (c'est-à-dire que vous n'aurez pas de plage de dates négative).
La sortie est un tableau contenant le nombre pour chaque jour, du plus ancien au plus récent dans l'entrée lorsqu'il est trié par date de début.
Ainsi, la sortie de l'exemple ci-dessus serait {3,2,2,0,1}
Il est possible que certains jours ne soient inclus dans aucune plage horaire, auquel cas la 0
sortie est effectuée pour cette date.
Critères gagnants
C'est le code-golf, donc les octets les plus bas gagnent. Les exclusions habituelles s'appliquent
Exemple de pseudo-algorithme
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
D'autres algorithmes pour arriver au même résultat sont très bien.
0
devrait être dans un dictionnaire? Cela semble seulement forcer l'utilisateur à parcourir de min(input)
à max(input)
, ce qui ne semble rien ajouter au cœur du défi (temps de calcul).