Вдохновленный реальным сценарием, на который я попросил ответить здесь: /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)
, что, кажется, не добавляет ничего к ядру задачи (вычисление временных интервалов).Ответы:
APL (Dyalog Unicode) , 32 байта SBCS
Полная программа. Запрашивает в stdin список пар международных номеров дат (например, какие используются Excel и MATLAB). И список, и пары могут быть заданы в любом порядке, например (Конец, Старт). Выводит список значений в стандартный вывод.
¯1+⊢∘≢⌸(R,⊢)∊(R←⌊/,⌊/+∘⍳⌈/-⌊/)¨⎕
Попробуйте онлайн!Если это неверно, список (YMD) пар может быть преобразован для дополнительных 21 байта, всего 53:
¯1+⊢∘≢⌸(R,⊢)∊(R⌊/,⌊/+∘⍳⌈/-⌊/)¨{2⎕NQ#'DateToIDN'⍵}¨¨⎕
Попробуйте онлайн!⎕
подскажите консоль для оцененного ввода(
…)¨
Применить следующую молчаливую функцию к каждой паре⌊/
минимальное (лит. мин-сокращение), т.е. дата начала⌈/-
максимальная (т.е. дата окончания) минус⌊/+∘⍳
дата начала плюс диапазон от 1 до что⌊/,
дата начала, предшествующая этомуR←
назначить эту функциюR
(для R ange)∊
ε NLIST (Flatten) перечень диапазонов в один список(
…)
Примените к этому следующую молчаливую функцию:R,⊢
результат примененияR
(т. е. диапазон дат), за которым следует аргумент(это гарантирует, что каждая дата в диапазоне представлена как минимум один раз и что даты отображаются в отсортированном порядке)
…
⌸
Для каждой уникальной пары (дата, ее индексы появления на входе) выполните:⊢∘≢
игнорировать фактическую дату в пользу подсчета индексов¯1+
добавьте -1 к этим подсчетам (потому что мы добавили одну из каждой даты в диапазоне)источник
JavaScript (ES6), 85 байт
Вводит в виде списка
Date
пар. Ожидает, что список будет отсортирован по дате начала. Возвращает массив целых чисел.Попробуйте онлайн!
или 84 байта, если мы можем принять метки времени JS в качестве входных данных (как предложено @Shaggy)
источник
JavaScript,
7573 байтаПринимает входные данные в виде отсортированного массива массивов пар примитивов даты, выводит объект, ключи которого являются примитивами каждой даты, и значения счетчиков этих дат в диапазонах.
Попытайся
Я работал над этой 60-байтовой версией, пока не было подтверждено, что даты, которые не появляются ни в одном из диапазонов, должны быть включены, поэтому поспешно обновил их до решения, указанного выше.
Попробуйте онлайн (или с удобочитаемыми датами в выходных данных )
источник
Октава , 63 байта
Попробуйте онлайн!
Теперь это было ужасно!
Объяснение:
Принимает входные данные как массив ячеек
datenum
элементов (то есть строку,"2001-01-01"
преобразованную в числовое значение, похожее на это:где
d()
функцияdatenum
. Затем мы используемcellfun
для создания ячеек с диапазонами от первого столбца до второго для каждой из этих строк. Мы объединяем эти диапазоны по горизонтали, чтобы у нас был длинный горизонтальный вектор со всеми датами.Затем мы создаем гистограмму, используя
histc
эти значения, а ячейки задаются диапазоном между самой низкой и самой высокой датой.источник
R 75 байт
Попробуйте онлайн!
Ввод - это матрица, первый столбец которой - начало, а второй - конец. Предполагается начало <= конец, но не требует сортировки дат начала.
источник
hist
; вы могли бы сделать ,c(-25668,min(x):max(x))
так как-25568
это , прежде ,1900
но это заканчивается быть больше , чем ваш предложенный ответ. Тем не менее, есть лучший способ создать даты, чемapply
; У меня есть один, который на 68 байтов, и я просто не нашел время, чтобы опубликовать его сам.(min(x)-1):max(x)
и это должно работать, как ожидалось; тогда, если вы можете найтиapply
способ генерирования дат, вы можете получить это до 63 байтов и связать ответ Octave.table
иfactor
до этого, который был моим первоначальным использованиемMap
для 68 байтов, ноhist
это аккуратный подход, о котором я всегда забываю, вероятно, потому что это раздражает, чтобы получить корзины правильно (как мы видели, )Красный , 174 байта
Довольно долгая и буквальная реализация.
Попробуйте онлайн!
Удобочитаемый:
источник
Groovy, 142 байта
Отформатировано:
источник
Python 2 ,
1148793 байта-27 байт благодаря Джонатану Аллану
+6 байт благодаря сундару
Вводит в виде списка пар объектов даты и времени.
Предполагается, что первая пара начинается с самой низкой даты.
Попробуйте онлайн!
источник
days
является аргументом по умолчанию дляtimedelta
.from datetime import*
и заменитьd+=timedelta(days=1)
на,d+=type(d-d)(1)
так как входы ужеdate
s. 87 байтов[(2001-01-01, 2001-01-05), (2001-01-02, 2001-01-03)]
. Если OP не позволяет нам разделять и переупорядочивать эти диапазоны во время предварительной обработки (что кажется маловероятным), этот ввод не может быть обработан этим кодом должным образом.Wolfram Language (Mathematica) , 62 байта
Попробуйте онлайн!
+35 байт, потому что OP указал, что
0
должно быть включено в вывод.Если пропустить запись в словаре были разрешены, 27 байтов
Попробуйте онлайн!
Встроенный
DayRange
принимает дваDateObject
s (или строковый эквивалент) и выводит списокDates
между этими датами (включительно).источник
R ,
6563 байтаПопробуйте онлайн!
Это сотрудничество между JayCe и мной, переносом ответа Стью Гриффин на R.
Цитировать JayCe:
Возможно,
$c
это не нужно, но это не совсем в духе задачи, поэтому я включил его.источник
Powershell,
122121118113 байтовсохранить как
count-timespan.ps1
. Тестовый скрипт:объяснение
источник
$cnt.Keys.Date
конечно.function
заменено наscriptblock
. коды для игры в гольф и без игры проверяются.scriptblock
заменено наfilter
. Зовfilter
более компактен.J, 43 байта
входные данные представляют собой список пар целых чисел, где каждое целое число является смещением от любого произвольного общего 0-дневного дня.
ungolfed
объяснение
структура это:
A&:B
вход слева, а вход сплющенный справа((>./ (] + i.@>:@-) <./)"1)
берет минимальное и максимальное значения из списка, возвращает результирующий диапазон и действует с рангом 1. следовательно, он дает общий диапазон справа и отдельные диапазоны слева.=
rank"0 _
(т. Е. Rank of{
), чтобы подсчитать, сколько раз каждый вход появляется в любом из диапазонов. наконец-то это происходит каждый год по этим показателям.Попробуйте онлайн!
источник
JavaScript (Node.js) , 80 байт
Попробуйте онлайн!
undefined
означает ноль; Первый элемент должен начинаться как можно раньше(a,u=[])=>a.map(g=([p,q])=>p>q||g([p,q-1],u[z=(q-a[0][0])/864e5]=-~u[z]))&&u
короче, если вы видите только элементы и используете больше стекаисточник
0
является приемлемой.Рубин , 70 байт
Попробуйте онлайн!
Входные данные:
Массив пар дат, отсортированных по дате окончания по убыванию.
источник
R (70)
Предполагает фрейм данных
x
с двумя столбцами (Start
и,End
возможно,S
иE
) с датами (классDate
).Попробуйте онлайн
источник
library(magrittr)
должно быть включено в число байтов.x
ваш ответ, то начинается сfunction(x)
тела, а затем тело функции.Юлия 0,6 , 77 байт
Попробуйте онлайн!
Вдохновленный решением Python @ DeadPossum .
Принимает входные данные в виде матрицы, в которой каждая строка имеет две даты: начальную и конечную даты диапазона ввода. Предполагается, что входные данные имеют самую раннюю дату в первую очередь, и что каждая строка имеет первую дату начала, но не предполагает никакой сортировки за пределами сортировки между различными строками.
Старое решение:
Юлия 0.6 , 124 байта
Попробуйте онлайн!
Принимает ввод как массив диапазонов дат. Не предполагает никакой сортировки между различными диапазонами в массиве.
источник