配列をビンに入れます


12

この単純なチャレンジでは、L負でない整数の入力配列と、b0より大きく、の長さ以下のビンの数が与えられます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]3番目のビンにはビン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
@Lembik コードゴルフの挑戦に有益、このような潜在的な奇妙なアプローチをどのように禁止していますか?
ジョナサンフレッチ

@JonathanFrechそれはちょうどOPの設定

回答:


5

APL(Dyalog)、19バイト

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

オンラインでお試しください!

bを追加しますの等しい部分にそれを再成形する前に、アレイにゼロ⌈⍺÷⍨≢⍵⌈⌉B÷Lの長さに示すように)と、それらを合計,⍺⍴0よりも大きい(元の配列の一部ではない)ブランクスポットの任意の量が、B -1は、他のチャンクからの少なくともb-1個の要素で満たされます。これにより、最後のグループのバランス点は、最大b-1残りと異なります。コードゴルフなので、b> b-1を使用します。

たとえば、15個の要素とb = 3を持つLは、次のようにグループ化されません。

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要素の配列は、次のように23-1)の空白スポットで埋められます。

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


3

R75 71 70 63バイト

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

オンラインでお試しください!

これは、長さがの倍数になるまでパディングLし、列の合計を行列として取ります。NAbLb列取り、削除ます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「幸運にも、これをチャレンジとして投稿するつもりだ」と言ってから実際に投稿するまでの間にTNBに飛び込んできました。
ジュゼッペ

1
ああ、「length [<-」は、お気に入りのバディ「[<-」と同じように戻ります。読みにくくするために保存されたバイトはありません: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)は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
これは私の意見で最も印象的な答えです。




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バイトのゴルフをしてくれたOlivierGrégoireに感謝します。

ゴルフされていないバージョン:

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

オンラインでお試しください!

Elixirで最も優れているのは、長さ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ηθ⊞η⁰

の長さがで割り切れるまでa 0を押します。LLb

E⪪η÷LηθIΣι

Lの長さで除算し、その長さのセクションにb分割Lしてから、各セクションを合計し、個別の行に暗黙的に出力するために文字列にキャストします。



1

C(clang)、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呼び出しで暗黙的に整数にキャストされます。

オンラインでお試しください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.