Zainspirowany scenariuszem z życia, o który poprosiłem o odpowiedź tutaj: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- pojawia się w zestawie z datą uruchomienia
Biorąc pod uwagę tablicę przedziałów czasowych (lub par data-data-początek), wypisz liczbę, ile przedziałów czasowych obejmuje każdego dnia, dla wszystkich dni w całym zakresie.
Na przykład:
# 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
Biorąc pod uwagę powyższe dane, wyniki powinny być następujące:
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)
Musisz podać tylko liczby dla każdego dnia (w kolejności, posortowane od najstarszych do najnowszych); nie w jakich rekordach się pojawiają.
Możesz założyć, że każdy przedział czasowy zawiera tylko daty, a nie godziny; a więc całe dni są zawsze reprezentowane.
I / O
Dane wejściowe mogą być dowolnym formatem reprezentującym zestaw przedziałów czasowych - a więc albo zestaw par czasów, albo zbiór (wbudowanych) obiektów zawierających daty początkowe i końcowe. Terminy są ograniczone do okresu od 1901 do 2099, co jest normalne w przypadku wyzwań PPCG.
Możesz założyć, że dane wejściowe są wstępnie posortowane, jak chcesz (podaj w odpowiedzi). Daty wprowadzania są włącznie (więc zakres obejmuje całość dat rozpoczęcia i zakończenia).
Możesz również założyć, że z dwóch dat w danym zakresie pierwszy będzie starszy lub równy drugiemu (tzn. Nie będziesz miał ujemnego zakresu dat).
Dane wyjściowe to tablica zawierająca liczbę dla każdego dnia, od najstarszego do najnowszego na wejściu, posortowane według daty początkowej.
Zatem wynik dla powyższego przykładu byłby {3,2,2,0,1}
Możliwe jest, że niektóre dni nie zostaną uwzględnione w żadnym przedziale czasowym, w którym 0
to przypadku jest generowany dla tej daty.
Zwycięskie kryteria
To jest golf golfowy, więc wygrywa najmniej bajtów. Obowiązują zwykłe wyłączenia
Przykład pseudo-algorytmu
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
Inne algorytmy pozwalające uzyskać ten sam wynik są w porządku.
0
powinienem znajdować się w słowniku? Wydaje się to tylko zmuszać użytkownika do iteracji od min(input)
do max(input)
, co wydaje się nie dodawać niczego do rdzenia wyzwania (obliczanie przedziałów czasowych).