自分自身で配列を追加する


22

今日の課題は、配列を取得してチャンクに分割し、それらのチャンクを追加することです。

仕組みは次のとおりです。プログラムまたは関数には、整数の配列aとチャンクサイズが与えられますL。配列をsizeの配列に分割する必要があります。L配列の長さが割り切れないL場合は、均等に割り切れるように0を追加する必要があります。配列がチャンク化されると、すべてのチャンクが要素ごとに一緒に追加されます。結果の配列が出力されます。

あなたはL0より大きいと仮定することができ、それaは空ではありません。aの内容がポジティブであると仮定することはできません。

以下に例を示します。

[1,2,3,4,5,6,7,8], 3 => [1,2,3]+[4,5,6]+[7,8,0] =>  [1+4+7,2+5+8,3+6+0] => [12,15,9]

テストケース:

Array                           Length   Output
[1]                             1        [1]
[1]                             3        [1,0,0]
[0]                             3        [0,0,0]
[1,2]                           3        [1,2,0]
[1,2]                           1        [3]
[-1,1]                          2        [-1,1]
[-7,4,-12,1,5,-3,12,0,14,-2]    4        [12,-1,0,1]
[1,2,3,4,5,6,7,8,9]             3        [12,15,18]

これは、最少バイトが勝ちます!


馬鹿じゃない?
sergiol

1
@sergiolこれが重複しているという質問を見つけたら、この投稿を自分で削除します。しかし、私が知る限り、それはduではありません。
パベル

回答:





5

Java 7、86バイト

派手な折り畳みや行列はなく、ちょうど良い昔ながらのforループ:)

int[]o(int[]a,int l){int i=0,o[]=new int[l];for(;i<a.length;)o[i%l]+=a[i++];return o;}

Ideoneでお試しください

裏地付き:

int[]o(int[]a,int l){
    int i=0,
        o[]=new int[l];
    for(;i<a.length;)
        o[i%l]+=a[i++];
    return o;
}

2
(8の代わりに)古き良き時代のJava 7で。;)
ケビンクルーッセン


5

JavaScript(ES6)、51バイト

a=>n=>a.map((v,i)=>o[i%n]+=v,o=Array(n).fill(0))&&o

カリー化構文の入力を受け取りますf([1,2])(3)

テストケース


(a,n,o=[])=>a.map((v,i)=>o[i%n]=~~o[i%n]+v)&&o

1
@Oki 2バイト短くなりますa=>n=>a.map((v,i)=>o[i%=n]=~~o[i]+v,o=[])&&oが、必要なゼロパディングは追加されません。
ジャスティンマリナー

f=文字数の一部である必要があります。
NL-X

1
@ nl-x匿名関数はデフォルトで許可されているため、コードで関数名を使用していない限り、f=不要です。HERESにメタの1つのポストこれについて。
ジャスティンマリナー

1
@ nl-x:いいえ、そうすべきではありません。関数に名前を付ける必要があるのは、それが再帰的である場合(または、おそらく、クイン)の場合のみです。そうでない場合、匿名関数は完全に有効です。こちらをご覧ください
シャギー

5

Mathematica、27バイト

Mathematicaにはほとんどこの機能が組み込まれています

Total@Partition[##,#2,1,0]&

Wolfram Sandboxで試してみてください

使用法

Total@Partition[##,#2,1,0]&[{-7, 4, -12, 1, 5, -3, 12, 0, 14, -2}, 4]

{12, -1, 0, 1}

説明

Total@Partition[##,#2,1,0]&

      Partition[##,#2,1,0]   (* Partition the first input into sublists of length
                                second input, using offset second input, and
                                right-pad zeroes for incomplete partitions *)
Total@                       (* Add all *)

リンクが機能していません。
シャギー

1
@Shaggyでは、コードを手動でコピーして貼り付ける必要があります。Wolfram Sandboxは事前入力をサポートしていません。
ジョンファンミン

4

Mathematica、58バイト

Total@Partition[PadRight[#,(s=Length@#)+Mod[-s,#2]],{#2}]&

入力

[{1}、3]

出力

{1,0,0}


[1]、3あなたがここでそれをテストすることができため、この作品 sandbox.open.wolframcloud.com コードの末尾に入力を追加して、Shift + Enterを押して
J42161217

4

Perl 6、36バイト

{[Z+] flat(@^a,0 xx$^b*2).rotor($b)}

試して

拡張:

{  # bare block lambda with 2 placeholder parameters 「@a」, 「$b」
  [Z+]
    flat(
      @^a,         # declare and use the first parameter
      0 xx $^b * 2 # 0 list repeated 2 * the second parameter
    )
    .rotor($b)     # split into chunks that are the size of the second param
}
[1,2], 3

( [1,2], (0,0,0,0,0,0) ) # @^a,0 xx$^b*2
(1,2,0,0,0,0,0,0)        # flat(…)
( (1,2,0), (0,0,0) )     # .rotor($b) # (drops partial lists)
(1,2,0)                  # [Z+]

3

APL(Dyalog)、22バイト

l左引数とa右引数として取ります。

{+⌿s⍴⍵↑⍨×/s←⍺,⍨⌈⍺÷⍨≢⍵}

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

{… 左辺引数()と右辺引数()がある} 匿名関数。la

≢⍵ 集計(長さ) a

⍺÷⍨ 除算 l

 天井(切り上げ)

⍺,⍨ 追記 l

s← 保管ss hape 場合)

×/ その積(つまり、必要な整数の数)

⍵↑⍨a(ゼロでパディング) からその多くの整数を取る

s⍴Rの形状にeshape s(行、列)

+⌿ 柱状和



3

Perl 6バイト

{[Z+] (|@^a,|(0 xx*)).rotor($^l)[0..@a]}

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

番号42が気に入ったら、交換できます *のために。これで42バイトになります:—)。

説明

{[Z+] (|@^a,|(0 xx*)).rotor($^l)[0..@a]} The whole function
{                                      } Anonymous block
      (    ,        )                    List with 2 elements
        @^a                              The first argument (it is a list)
             (0 xx*)                     Infinite list of zeroes
       |    |                            Flatten both of the lists into the larger list.
                    .rotor($^l)          Split the list into a list of lists, each (the second argument) long.
                               [0..@a]   Only the first (1 + length of the first argument) of them.
 [Z+]                                    Add the corresponding elements up.

最後の「追加」の背後にある魔法は、演算子が「+を使用してzipで縮小」することです。ちなみに、リストが1つだけのリストでのみ使用した場合、これは壊れますが、元のリストが空ではない場合(最後から2番目の行のため)には起こりません。また@a、だけでなく@a * $lアイテムも取得することに注意してください。幸いなことに、最終結果に影響しないゼロのみを追加しました。



3

Pyth、8バイト

m+F%Q>vz

ここで試してみてください!

Pyth、10バイト

sMCc.[EZQQ

ここで試してみてください!

説明

説明#1

m+F%Q>vz   Full program. Q means input.

m          Map over the implicit range [0, input_1), with a variable d.
     >vz  All the elements of input_2 after d; input_2[d:] in Python.
   %Q     Every Qth element of ^.
 +F       Sum. Implicitly output the result.

説明#2

sMCc。[EZQQ完全プログラム。

    。[E 2番目の入力を右にパディングします。
       Z ...ゼロ(0)、最も近い倍数まで...
        Q ...最初の入力。
   c Q最初の入力に等しい長さのチャンクに切り刻みます。
  C行列転置。ネストされたリストのすべての列を取得します。
sM合計。
             出力(暗黙的に)。 

次のようなものはどうですか:sM.TcEQ
ジャクベ

@Jakube最初はゼロでパディングする必要があるため、これは誤りです。それはLeakyの最初の試みでしたが[1], 3、のために失敗し、の[1]代わりに与えるでしょう[1, 0, 0]
ミスターXcoder

すみません、私の間違いです。
ジャクベ

3

J15 12バイト

]{.+/@(]\~-)

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

説明

]{.+/@(]\~-)  Input: array A (LHS), chunk size L (RHS)
          -   Negate L
       ]\~    Take each non-overlapping sublist of size L in A
   +/@        Reduce the columns by addition
]             Get L
 {.           Take that many, filling with 0's

ボックスを廃止できない理由はありますか?どうですか:[:+/-@[[\]
ジョナ

@Jonahチャンクサイズが入力配列の長さよりも大きい場合、ゼロが埋め込まれません。
マイル

すてきな編集-ずっときれいになりました。
ジョナ

3

05AB1E、8バイト

ô0ζO²Å0+

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

ô0ζO²Å0+   Full program
ô          Push <1st input> split into a list of <2nd input> pieces
 0ζ        Zip sublists with 0 as a filler
   O       Sum each sublist
           --- from here, the program handles outputs shorter 
               than the required length
    ²Å0    Push a list of zeros of length <2nd input>
       +   Sum the result with that list

3

05AB1E、8バイト

Å0+¹ô0ζO

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

Å0       # Push an arrary of all 0s with length l
  +      # Add that to the array
   ¹ô    # Split into chunks of length l
     0ζ  # Zip, padding with 0s
       O # Sum each chunk

私自身のソリューションとほぼ同じ:codegolf.stackexchange.com/a/143186/73296
スコッティネット

@scottinet私はそれを見逃したに違いない。それらは十分に異なっているので、私は私のものを残してあなたのものに賛成します:)
ライリー

私は本当に気にしません、ただそれを指摘したかっただけです:)
スコチネット

@scottinet興味深いことに、操作を再配置して、同じバイトカウントとほぼ同じバイトを使用して(¹vs ²)出てくることができます
ライリー

2

SOGL V0.12、14のバイト

l⁵%⁵κ{0+}nI⌡∑¹

ここで試してみてください!または、すべてのテストケースを試してください。これは名前のない関数として書かれてchunk length; arrayおり、スタック上で期待されています。

説明:

padding zeroes
l          get the array's length
 ⁵%        modulo the chunk length
   ⁵κ      chunk length - result of above
     {  }  that many times
      0+     append a 0 to the array

adding the array together
n      split into the chunks
 I     rotate clockwise
  ⌡    for each
   ∑     sum
    ¹  wrap the results in an array

FリンクしたTry it Hereコードの目的は何ですか?
パベル

@Pavel関数名。JSと同じようにf=a=>a+2f=パーツはカウントされF\nません-SOGL ではカウントされません。
dzaima

2

05AB1E、12バイト

gs÷*+Å0¹+ôøO

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

説明

gs÷*+Å0¹+ôøO
g            # Get the length of the first input (the array)
 s           # Push the second input on top of the result
  ÷          # integer divide the two values
   *         # Multiply with the second input (the length)...
    +        # and add the second input to the result
     Å0      # Create a list of zeros with that length
       ¹+    # Add it to the first input
         ô   # And finally split it into chunks of the input length...
          ø  # ...transpose it...
           O # and sum each resulting subarray
             # Implicit print



2

R62 57バイト

user2390246のおかげで-5バイト

function(a,l)rowSums(matrix(c(a,rep(0,l-sum(a|1)%%l)),l))

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

空のケースを処理する必要がなくなったため、更新されました。

パッドaゼロでは、マトリクス構築l行、およびを計算し、行の合計を返します。



もちろん@ user2390246!空のケースを処理しなければならなかったとき、私は古いバージョンでそれを持っていましたが、これは私の「プライマリ」であり、私はそれをもう一度試すとは思いませんでした。
ジュゼッペ



2

Japt、7バイト

男、[1], 3テストケースで妥当なバイト数で動作させるために、間違ったJaptメソッドと長い間戦っていました!

VÆëVX x

それを試してみてください


説明

配列Uと整数の暗黙的な入力V

0to から整数の配列を生成し、V-1それぞれをX現在の要素として関数に渡します。

ëVX

indexから始まるのすべてのV要素をU取得しますX

x

追加してその配列を減らします。


2

C、(GCC)101 86バイト

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

f(int*a,int l,int s,int*m){if(s){int i=l;while(i&&s){m[l-i--]+=*a++;s--;}f(a,l,s,m);}}

使用法

int main() {
   int l = 3;
   int a[8] = {1,2,3,4,5,6,7,8};
   int *m = (int *)malloc(sizeof(int) * l);
   f(a, l, 8, m);
   for (int i=0; i<3; i++) {
    printf("%d, ",m[i]);
   }
}

配列の長さ(s)とヒープ上の新しい動的配列(m)を渡す必要があることに注意してください。



1

PowerShell、62バイト

param($a,$l)1..$l|%{$y=--$_;($o=0)..$l|%{$o+=$a[$y+$_*$l]};$o}

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

私たちはインプットの$aレイと力を取ります$l。次にから1にループし$lます。繰り返しごとにヘルパー$yを現在の数値より1つ小さく設定します(これは、PowerShellが0インデックスであるが、長さ$lは1インデックスであるためです)。次に、$output をに設定し、0再びにループし$lます。各内部反復は$o、適切にインデックス付けされた$array要素に単純に累積しています。これは、配列の末尾を超えてインデックスを作成する$nullとが返されるという事実を活用しています0 + $null = 0

内側のループが完了したら、出力$oして次のチャンクに進みます。さまざまな出力はパイプラインに残され、暗黙的な出力はWrite-Outputプログラムの完了時に発生します。



1

、10バイト

Fż+So:`R0C

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

非ゴルフ/説明

             -- implicit inputs n & xs                   | 3  [1,2,3,4]
   S      C  -- cut xs into sublists of length n & ...   | [[1,2,3], [4]]
    (:`R0)   -- ... prepend [0,...,0] (length n)         | [[0,0,0], [1,2,3], [4]]
F            -- accumulate the sublists with             |
 ż+          -- element-wise addition                    | [0+1+4, 0+2, 0+3]

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