Покладіть масив у бункери


12

У цьому простому виклику вам надається вхідний масив 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. Ваш код може виводити все, що заманеться для цих входів.


6
Я думаю, що ще кілька тестових випадків було б непогано.
Джонатан Фрех

5
your code must run in linear time- Я знайшов би будь-який алгоритм, який не дотримується цього природно досить дивного
Уріель,

2
@Uriel Не існує обмежень, якими можуть бути дивні відповіді на код-гольф :)

4
@ Лембік Хоча яким чином забороняє такі потенційні дивні підходи вигідні для кодового гольфу?
Джонатан Фрех

@JonathanFrech це просто до уподобань ОП :)

Відповіді:


5

APL (Dyalog) , 19 байт

{+/⍺(⌈⍺÷⍨≢⍵)⍴⍵,⍺⍴0}

Спробуйте в Інтернеті!

Ми додаємо b нулі до масиву, перш ніж перерозподілити його на рівні частини ⌈⍺÷⍨≢⍵( ⌈ довжина L ÷ b ⌉ ) та підсумувати їх, як зображено на рисунку ,⍺⍴0, оскільки будь-яка кількість порожніх плям (які не є частиною вихідного масиву) більша ніж b - 1 буде заповнений щонайменше b - 1 елементами з інших фрагментів, що робить точку врівноваження останньої групи максимальною b - 1 різницею від решти. Ми використовуємо b> b - 1, оскільки це код гольфу.

Наприклад, L з 15 елементами і b = 3 не згрупуються як

x x x x x x
x x x x x x
x x x 0 0 0

а скоріше як (зверніть увагу, як найменша права частина 2 x"заповнює" ліві нулі)

x x x x x
x x x x x
x x x x x

тоді як масив 16 елементів буде заповнений 2 ( 3 - 1 ) порожніми плямами, як

x x x x x x
x x x x x x
x x x x 0 0


3

R , 75 71 70 63 байт

function(L,b)colSums(matrix(L[1:(ceiling(sum(L|1)/b)*b)],,b),T)

Спробуйте в Інтернеті!

Цей колодок Lз, NAпоки довжина не кратна b, потім приймає суми стовпців Lяк матрицю зі bстовпцями, видаляючи NAзначення.

Пояснення як мова на основі стека:

function(L,b){
      (ceiling(sum(L|1)/b*b)  # push the next multiple of b >= length(L), call it X
    1:..                      # push the range 1:X
  L[..]                       # use this as an index into L. This forces L
                              # to be padded to length X with NA for missing values
        matrix(..,,b)         # create a matrix with b columns, using L for values
                              # and proceeding down each column, so
                              # matrix(1:4,,2) would yield [[1,3],[2,4]]
colSums(.., na.rm = T)        # sum each column, removing NAs


Дуже приємно і швидко! Підйом кодера R ...

2
@Lembik Мені пощастило, що я потрапив у ТНБ прямо між вами, кажучи: "Я збираюся це поставити як виклик", і ви насправді це публікуєте.
Джузеппе

1
О, погляд "довжина [<-" повернеться так само, як і наш улюблений приятель "[<-". Не збережено жодних байтів для меншої читабельності:function(L,b)colSums(matrix("length<-"(L,ceiling(length(L)/b)*b),,b),T)
Vlo

1
@Vlo no bytes saved for less readability, мабуть, девіз R гольфу ... хоча я гадаю, що sum(L|1)це байт, врятований від length(L)!
Джузеппе

3

MATL , 6 байт

vi3$es

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

Розглянемо введення 4, в [0,3,7,2,5,1]якості прикладу.

v       % Vertically concatenate stack contents. Gives the empty array, []
        % STACK: []
i       % Input b
        % STACK: [], 4
        % Implicitly input L at the bottom of the stack
        % STACK: [0,3,7,2,5,1], [], 4
3$e     % 3-input reshape. This reshapes L with [] rows and b columns, in
        % column-major order (down, then across). [] here means that the
        % number of rows is chosen as needed to give b columns. Padding
        % with trailing zeros is applied if needed
        % STACK: [0 7 5 0;
                  3 2 1 0]
s       % Sum of each column
        % STACK: [3 9 6 0]
        % Implicitly display

1
Це найбільш вражаюча відповідь на мій погляд.

3

Рубі , 54 53 байти

Збережено байт завдяки @Kirill L.

->l,b{s=1.0*l.size/b;(1..b).map{l.shift(s.ceil).sum}}

Спробуйте в Інтернеті!


Приємно, ви також можете зберегти байт, замінивши [0]*bйого1..b
Кирилл Л.

@KirillL. Дякую. Мені навіть не прийшло в голову.
Відновіть Моніку - немайнард



2

Java 10, 96 89 86 байт

a->b->{int r[]=new int[b],i=0,n=a.length;for(;i<n;)r[i/((n+b-1)/b)]+=a[i++];return r;}

Спробуйте його онлайн тут .

Знайшов коротший спосіб написати i/(n/b+(n%b==0?0:1) тут: i/((n+b-1)/b)

Завдяки Олів'є Грегоаре за те, що він займався 3 байтами для гри в гольф.

Негольована версія:

input -> bins -> { // input is int[] (original array), bins is int (number of bins)
    int result[] = new int[bins], // resulting array, initialized with all 0
    i = 0, // for iterating over the original array
    n = a.length; // length of the original array
    for(; i < n ;) // iterate over the original array
        result[i / ((n + bins - 1) / bins)] += input[i++]; // add the element to the right bin; that's bin n/bins if bins divides n, floor(n/bins)+1 otherwise
    return result;
}


@ OlivierGrégoire Дякую!
OOBalance

1

Еліксир , 98 байт

fn l,b->Enum.map Enum.chunk(l++List.duplicate(0,b-1),round Float.ceil length(l)/b),&Enum.sum/1 end

Спробуйте в Інтернеті!

Найкращий Еліксир - це розщеплення на частини довжиною n . І воно не може дуже добре поділити поділ як ціле, тому ми робимо поплавковий поділ, округлюючи його. На жаль, єдиний спосіб зробити це приводить до поплавця, тому ми знову округлимо його до цілого числа.


Деякі ваші результати мають неправильну довжину.

@Lembik виправив це.
Okx

1

Perl 6 ,  52 51  50 байт

52 байти: протестуйте

->\L,\b{L.rotor(:partial,ceiling L/b)[^b].map: &sum}

51 байт: протестуйте

{@^a.rotor(:partial,ceiling @a/$^b)[^$b].map: &sum}

50 байт: Спробуйте

{map &sum,@^a.rotor(:partial,ceiling @a/$^b)[^$b]}

47 байт не конкуруючий Тестуй це

{@^a.rotor(:partial,ceiling @a/$^b)[^$b]».sum}

Це не конкурує, як ».sumдозволяється робити розрахунки паралельно. Так що це може бути, а може і не бути в лінійному часі.


Розширено:

{  # bare block with two placeholder parameters 「@a」 and 「$b」

  map                   # for each sublist

    &sum,               # find the sum


    @^a                 # declare and use first parameter

    .rotor(             # break it into chunks

      :partial,         # include trailing values that would be too few otherwise

      ceiling @a / $^b # the number of elements per chunk

    )[ ^$b ]           # get the correct number of chunks if it would be too few

}

1

Вугілля деревне , 22 байти

NθAηW﹪Lηθ⊞η⁰E⪪η÷LηθIΣι

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Nθ

Вхідні дані b.

Aη

Вхідні дані L.

W﹪Lηθ⊞η⁰

Натисніть 0на, Lпоки Lдовжина не поділиться на b.

E⪪η÷LηθIΣι

Розділіть Lдовжину на bта розділіть Lна секції такої довжини, а потім підсумовуйте кожен розділ та передавайте на рядок для неявного виводу на окремі рядки.



1

C (стук) , 58 байт

i;f(*L,l,b,*m){b=l/b+!!(l%b);for(i=0;i<l;m[i++/b]+=L[i]);}

Спробуйте в Інтернеті!

f()приймає параметри так
L:: вказівник на масив введення
l: довжина вхідного масиву
b: кількість бін
m: вказівник на буфер, який отримує новий масив

Далі йде повторна версія @ 60 байт:

f(*L,l,b,*m){b=l/b+!!(l%b);for(int i=0;i<l;m[i++/b]+=L[i]);}

1

PHP, 88 байт

function($a,$b){return array_map(array_sum,array_chunk($a,~-count($a)/$b+1))+[$b-1=>0];}

анонімна функція, приймає масив і ціле число, повертає масив

Тільки гра в гольф потенціал цього було заміняв ceil(count($a)/$b))з (count($a)-1)/$b+1і скороченим (count($a)-1)з ~-count($a). Отриманий поплавок неявно переноситься на ціле число у array_chunkвиклику.

Спробуйте в Інтернеті .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.