Ispirato da uno scenario di vita reale, a cui ho chiesto una risposta qui: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- appare-in-a-set-of-date-ran
Dato un array di periodi di tempo (o coppie startdate-enddate), genera un conteggio del numero di periodi di tempo coperti ogni giorno, per tutti i giorni nell'intervallo totale.
Per esempio:
# 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
Dati i dati di cui sopra, i risultati dovrebbero essere i seguenti:
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)
Devi solo generare i conteggi per ogni giorno (in ordine, ordinati dal più vecchio al più recente); non in quali record compaiono.
Puoi presumere che ogni periodo di tempo contenga solo date, non orari; e così i giorni interi sono sempre rappresentati.
I / O
L'input può essere qualsiasi formato che rappresenti un insieme di intervalli di tempo, quindi un insieme di coppie di tempi o una raccolta di oggetti (incorporati) contenenti le date di inizio e fine. Le date sono limitate tra il 1901 e il 2099, come è normale per le sfide PPCG.
Puoi presumere che l'input sia preordinato come preferisci (specifica nella tua risposta). Le date di input sono incluse (quindi l'intervallo comprende tutte le date di inizio e fine).
Puoi anche supporre che, delle due date in un dato intervallo, la prima sarà più vecchia o uguale alla seconda (cioè non avrai un intervallo di date negativo).
L'output è un array che contiene il conteggio per ogni giorno, dal più vecchio al più recente nell'input quando ordinato per Data di inizio.
Quindi, l'output per l'esempio sopra sarebbe {3,2,2,0,1}
È possibile che alcuni giorni non siano inclusi in alcun intervallo di tempo, nel qual caso 0
viene emesso per quella data.
Criteri vincenti
Questo è code-golf, quindi vince il byte più basso. Si applicano le esclusioni usuali
Esempio di 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
Altri algoritmi per ottenere lo stesso risultato vanno bene.
0
dovrebbe essere in un dizionario? Sembra solo forzare l'utente a iterare da min(input)
a max(input)
, il che non sembra aggiungere nulla al nocciolo della sfida (calcolo dei tempi).