Задача в этой задаче состоит в том, чтобы поместить элементы массива в временные интервалы. Входные данные будут неубывающим массивом натуральных чисел, представляющих время событий, и целым числом, которое представляет размер каждого бина. Давайте начнем с примера. Мы называем входной массив A
и выходной массив O
.
`A = [1,1,1,2,7,10]` and `bin_size = 2`.
`O = [4,0,0,1,1]`.
Почему ? С a bin_size = 2
у нас будут следующие интервалы: (0,2], (2,4], (4,6], (6,8], (8,10]
где четыре элемента (1,1,1,2)
находятся в первом интервале (0,2]
, ни один во втором и третьем интервалах, один 7
в интервале (6,8]
и один 10
в интервале (8,10]
.
Ваш код должен учитывать каждый интервал длины, bin_size
начиная с, 0
и подсчитывать количество чисел A
в каждом. Вы всегда должны включать в правом конце интервала в бункере так и в приведенном выше примере 2
включается в подсчет 4
. Ваш код должен работать за линейное время в сумме длин входных и выходных данных.
Больше примеров:
`A = [1,2,7,12,15]` and `bin_size = 5`.
`O = [2, 1, 2]`.
`A = [1,2,7,12,15]` and `bin_size = 3`.
`O = [2,0,1,1,1]`.
Вы можете предположить, что ввод и вывод могут быть даны в любом удобном для вас формате. Вы можете использовать любые языки и библиотеки, которые вам нравятся.
0
Разрешены ли выходы с трейлингом ? Так что вернемся[2,0,1,1,1,0]
вместо[2,0,1,1,1]
?bin_size
, мы должны действительно обрабатывать это? Кажется, что большинство ответов так и есть, но если это так, было бы неплохо добавить контрольный пример для этого сценария, чтобы избежать путаницы.Ответы:
R , 48 байтов
Попробуйте онлайн!
Еще раз,
table
иcut
тины кfactor
делать трюк для биннинга. Выходы поименованныйvector
гдеnames
находятся интервалы, в интервальной нотации, например,(0,5]
.РЕДАКТИРОВАТЬ: вернуться к более ранней версии, которая работает, когда
s
не делитсяn
.источник
format you [most likely do not] find convenient
безtable
части.cut
разбивает вектор на факторы с уровнями, заданными интервалами, иtable
подсчитывает вхождения каждого уникального значения в его входных данных.0:ceiling(max(n)/s)*s
сseq(0,max(n)+s-1,s)
. Это работает по крайней мере для двух образцов в вопросе.1:max(n/s+1)*s-s
это еще одно улучшение, так как оба они эквивалентныОктава , 36 байт
Попробуйте онлайн!
Охота на пасхальные яйца и разведение костра. Я добавлю объяснение, когда у меня будет время.
источник
Perl 5
-a
-i
,3228 байтДайте счет после опции -i. Дайте каждый элемент ввода в отдельной строке на STDIN
Попробуйте онлайн!
источник
Python 2 , 62 байта
Попробуйте онлайн!
источник
I[-1]/s+1
должны быть~-I[-1]/s+1
вместо.05AB1E , 18 байт
Попробуйте онлайн!
источник
A.count
max (A) , поэтому время выполнения не линейно в len (A) + len (O) . Это правильно или я что-то не так понял?O(max(A)*max(A))
... таким образом, он был квадратичным по максимуму А ... ОП указал, что он должен быть линейным с точки зрения ... что именно?APL + WIN, 23 байта
Запрашивает ввод на экран бинов, а затем вектор целых чисел:
Объяснение:
источник
C ++ (gcc) ,
9083 байтаПопробуйте онлайн!
источник
Java 8, 75 байт
Порт ответа @ DeadPossum на Python 2 , поэтому обязательно подтвердите его ответ!
Объяснение:
Попробуйте онлайн.
источник
Рубин , 60 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 60 байт / O (len (a) + max (a) / n)
Сохранено 5 байтов благодаря @Neil
Принимает ввод в синтаксисе карри
(a)(n)
.Попробуйте онлайн!
Или просто 43 байта / O (len (a)), если разрешены пустые элементы.
источник
[...o].map(n=>n|0)
получает первый вывод из второго решения в меньшем количестве байтов.Haskell ,
637570 байтУпс, этот короткий не линейный, а квадратичный;
Попробуйте онлайн!
источник
Pyth,
2322 байтаПопробуй здесь
источник
Рубин ,
5350 байтРедактировать: -3 байта от iamnotmaynard.
Попробуйте онлайн!
источник
a.max
не кратноb
(например,f[[1,1,1,2,7,10],3]
=>,[4, 0, 1]
но должно дать[4, 0, 2]
). Я попробовал тот же подход.[4, 0, 1, 1]
)Эта головоломка по сути является графом-сортировкой. Мы не знаем длину вывода, не пройдя сначала ввод.
C (лязг) , 53 байта
Попробуйте онлайн!
Это решение принимает следующие параметры: длина
A
входного массива хранилища bin_size для вывода. Должен быть достаточной длины и возвращает результат в O.l
b
O
Это решение имеет недостаток: оно не возвращает длину выходного массива O, и поэтому вызывающая сторона не знает, сколько печатать.
Следующая версия преодолевает этот недостаток:
C (лязг) , 79 байтов
Попробуйте онлайн!
Он принимает дополнительный параметр
m
и возвращает в нем длинуO
. Это стоило мне 26 байт.источник
C (gcc) ,
102908986 байтПопробуйте онлайн!
Спасибо Кевину Круйссену за сокращение 12 байт и потолочную кошку за еще 4 байта!
источник
int
и изменяя==1
на>0
.O(n)
вовремя, поэтому у вас не может быть вложенных циклов for (хотя ваш ответ на C ++ кажется нормальным. Поэтому яO(n)
зацикливает входные элементы. Даже если внутренний цикл будет повторяться только 2 раза, он уже вышеO(n)
. Или я что-то недопонимаю ... Должен признать,O
что на самом деле это не моя компетенция ...