Натхненний сценарієм реального життя, на який я попросив відповідь тут: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- з'являється в наборі дату-запущена
Враховуючи масив часових просторів (або пари startdate-enddate), виведіть підрахунок, скільки часових просторів охоплює кожен день, за всі дні в загальному діапазоні.
Наприклад:
# 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
З огляду на вищезазначені дані, результати мають бути такими:
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)
Вам потрібно лише вивести підрахунки за кожен день (по порядку, відсортовано найстаріше-новітнє); не в яких записах вони з’являються.
Ви можете припустити, що кожен проміжок часу містить лише дати, а не часи; і так цілі дні завжди представлені.
I / O
Введенням може бути будь-який формат, який представляє набір часових просторів - тобто або набір пар разів, або набір (вбудованих) об'єктів, що містять дати початку та закінчення. Час проведення дат обмежується між 1901 та 2099 роками, як це нормально для проблем, пов'язаних з ППГ.
Ви можете припустити, що вхід попередньо відсортовано, як вам подобається (вкажіть у своїй відповіді). Дати введення включені (тому діапазон включає всю дату початку та кінця).
Ви також можете припустити, що з двох дат у будь-якому даному діапазоні перша буде старшою або дорівнює другій (тобто у вас не буде негативного діапазону дат).
Вихід - це масив, що містить кількість за кожен день, від найдавнішого до найновішого вхідного даних, відсортованого за датою початку.
Отже, вихід для вищевказаного прикладу був би {3,2,2,0,1}
Можливо, що деякі дні не включаються в будь-який часовий діапазон, і в цьому випадку 0
виводяться на цю дату.
Критерії виграшу
Це код-гольф, тому виграє найнижчий байт. Застосовуються звичайні виключення
Приклад псевдоалгоритму
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
Інші алгоритми, щоб дійти до того ж результату, чудово.
0
має бути в словнику? Він з'являється тільки , щоб змусити користувача ітерованих від min(input)
до max(input)
, який , здається, не додає нічого до ядру завдання (обчислювальні timespans).