Вдохновленный реальным сценарием, на который я попросил ответить здесь: /superuser/1312212/writing-a-formula-to-count-how-many-times-each-date- появляется в-а-набор просрочен-RAN
Учитывая массив временных интервалов (или пар 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 годами, что является нормальным для соревнований PPCG.
Вы можете предположить, что ввод предварительно отсортирован, как вам нравится (укажите в своем ответе). Даты ввода включительно (поэтому диапазон включает в себя все даты начала и окончания).
Вы также можете предположить, что из двух дат в любом заданном диапазоне первая будет старше или равна второй (т.е. у вас не будет отрицательного диапазона дат).
Выходные данные - это массив, содержащий счет за каждый день, от самого старого до самого нового во входных данных при сортировке по дате начала.
Таким образом, вывод для приведенного выше примера будет {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)
, что, кажется, не добавляет ничего к ядру задачи (вычисление временных интервалов).