В этом простом задании вы получаете входной массив L
неотрицательных целых чисел и количество бинов b
больше 0, но не больше длины L
. Ваш код должен возвращать новый массив M
, длина которого равна b
и которая содержит массив L
. Это проще всего объяснить на примерах.
L = [1,0,5,1]
и b = 2
возвращается M = [1,6]
.
L = [0,3,7,2,5,1]
и b = 3
возвращается M = [3,9,6]
.
Пока все просто. Однако в этом вопросе b
не обязательно делить len(L)
. В этом случае последний бин будет иметь меньше чисел, чтобы составить его.
Каждый бин, кроме, возможно, последнего, должен иметь одинаковое количество чисел, вносящих вклад в его общее количество. Последний бин должен иметь не больше чисел, способствующих этому, чем другие бины. В последнем бине должно быть как можно больше чисел, способствующих этому, в соответствии с другими правилами.
L = [0,3,7,2,5,1]
и b = 4
возвращается M = [3,9,6,0]
. M = [10,8,0,0]
не является приемлемым выводом, так как третий бин не имеет имени числа чисел, вносящих в него свой вклад в качестве бинов 1
и 2
.
L = [0,3,7,2,5]
и b = 2
возвращается M = [10,7]
. M = [3, 14]
не является приемлемым выводом, так как последний бин будет иметь 3
элементы, способствующие этому, но первый имеет только 2
.
L = [1,1,1,1,1,1,1]
и b = 3
возвращается M = [3,3,1]
.
Как последнее правило, ваш код должен работать за линейное время.
Вы можете использовать любой язык или библиотеки, которые вам нравятся, и можете предполагать, что ввод предоставляется любым удобным для вас способом.
Оказывается, есть некоторые входные данные, которые не могут быть решены. Например [1,1,1,1,1]
и b=4
. Ваш код может выводить все что угодно для этих входных данных.
your code must run in linear time
- Я нашел бы любой алгоритм, который не следует этому, естественно, довольно странноОтветы:
APL (Дьялог) , 19 байт
Попробуйте онлайн!
Мы добавляем b нулей к массиву перед преобразованием его в равные части
⌈⍺÷⍨≢⍵
( ⌈ длина L ÷ b ⌉ ) и суммируем их, как показано на рисунке,⍺⍴0
, так как любое количество пустых пятен (которые не являются частью исходного массива) больше, чем b - 1 будет заполнен как минимум b - 1 элементами из других блоков, что делает точку балансировки последней группы на максимальном значении b - 1 отличным от остальных. Мы используем b> b - 1, потому что это код гольф.Например, L с 15 элементами и b = 3 не будут сгруппированы как
а скорее как (обратите внимание, как самые правые 2
x
с «заполняют» самые левые нули)в то время как массив из 16 элементов будет заполнен 2 ( 3 - 1 ) пустыми пятнами, как
источник
Python 2 , 65 байт
Попробуйте онлайн!
источник
R ,
75717063 байтПопробуйте онлайн!
Эти подушечки
L
сNA
до тех пор , пока длина кратнаb
, затем принимает сумму столбцовL
в виде матрицы сb
колоннами, извлекаяNA
значения.Объясняя как основанный на стеке язык:
источник
function(L,b)colSums(matrix("length<-"(L,ceiling(length(L)/b)*b),,b),T)
no bytes saved for less readability
, вероятно, девиз игры в гольф R ... хотя я полагаю, чтоsum(L|1)
это байт, сохраненный отlength(L)
!MATL , 6 байтов
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Рассмотрим ввод
4
,[0,3,7,2,5,1]
как пример.источник
Рубин ,
5453 байтаСохраненный байт благодаря @Kirill L.
Попробуйте онлайн!
источник
[0]*b
на1..b
C (gcc) , 107 байт
Попробуйте онлайн!
источник
Haskell , 61 байт
Попробуйте онлайн!
источник
[1, 2, 3, 4, 5, 6] # 3
.Java 10,
968986 байтПопробуйте это онлайн здесь .
Нашел более короткий способ написать
i/(n/b+(n%b==0?0:1)
здесь:i/((n+b-1)/b)
Спасибо Оливье Грегуару за игру в гольф 3 байта.
Безголовая версия:
источник
Эликсир , 98 байт
Попробуйте онлайн!
Лучший эликсир имеет расщепление на части длиной n . И оно не может хорошо разделить деление на целое число, поэтому мы делим деление на округление. К сожалению, единственный способ сделать это приводит к плавающей запятой, поэтому мы снова округляем его до целого числа.
источник
Perl 6 ,
52 5150 байт52 байта: проверить это
51 байт: проверить это
50 байт: попробуйте
47 байт , не конкурируя Попробуй
Он неконкурентный, так как
».sum
ему разрешено выполнять вычисления параллельно. Так может быть или не быть в линейном времени.Expanded:
источник
Древесный уголь , 22 байта
Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Вход
b
.Вход
L
.Нажмите до,
0
чтобы длина делится на .L
L
b
Разделите
L
длину наb
и разделитеL
на секции этой длины, затем сложите каждую секцию и приведите к строке для неявного вывода в отдельных строках.источник
JavaScript (Node.js) , 71 байт
Попробуйте онлайн!
источник
C (лязг) , 58 байт
Попробуйте онлайн!
f()
принимает параметры следующим образом:L
указатель на входной массивl
: длина входного массиваb
: количество биновm
: указатель на буфер, который получает новый массивНиже приведена повторная входная версия @ 60 байт:
источник
PHP, 88 байт
анонимная функция, принимает массив и целое число, возвращает массив
Только игра в гольф потенциал этого было заменял
ceil(count($a)/$b))
с(count($a)-1)/$b+1
и сокращенным(count($a)-1)
с~-count($a)
. Результирующий float неявно приводится к целому числу вarray_chunk
вызове.Попробуйте онлайн .
источник