列ごとの合計


30

数値の空でない行の空でないリストが与えられた場合、列ごとのsumを計算します。これは、最長の入力行の長さを持つ別のリストです。出力リストの最初のエントリは、入力行の最初の全体の合計、2番目のエントリはすべての2番目の要素(使用可能な場合)などの合計です。次の例でより適切に説明すると思います。

Input:      {[1,2,3,4],[1],[5,2,3],[6,1]}
Computation: [1,2,3,4]
              + . . .
             [1]. . .
              + + + .
             [5,2,3].
              + + . .
             [6,1]. .
              = = = =
    Output: [13,5,6,4]

テストケース

{[0]}                         -> 0
{[1],[1,1,1,1]}               -> [2,1,1,1]
{[1],[1,2],[1,2,3],[1,2,3,4]} -> [4,6,6,4]
{[1,6,2,-6],[-1,2,3,5]}       -> [0,8,5,-1]

配列には整数のみが含まれますか?
ETHproductions 16

私はこれまでそれについて考えませんでしたが、あなたはそれを仮定できると思います。それに反対することはありますか?
flawr 16

そうは思いません。すべてのテストケースは整数のみを使用しており、既存の回答を無効にしないことは確かです(一部の回答ではバイトを節約することもあります)。
ETHproductions 16

それでは、この仮定は完全に受け入れられると思います。また、チャレンジ自体は変わりません。
flawr 16

回答:


19

ゼリー、1バイト

S

オンラインでお試しください!または、すべてのテストケースを確認します

使い方

合計アトムSは、の短縮形であり+/、加算による削減を実行します。

クイック/ディメンションは最も外側のディメンションに沿って縮小するため、入力の要素のリンクを呼び出します。ここでは、要素は行です。

加算アトムは+ベクトル化されるため、2つの行ベクトルを追加すると、要素ごとの加算が実行されます。引数の長さが異なる場合、短い引数に対応する引数がない長い引数の要素は変更されません。

全体として、引数として不規則行列を使用してS、列ごとの合計を計算し、短い行の欠落しているエントリをスキップします。


1
フー、Jellyでの自動ベクトル化の通常の動作を考えると、行単位の合計になると予想していました。行単位で合計するとS€

1
2D配列の場合、はい。/ベクトル化しません。対応するダイアドをその引数のすべての要素に適用するだけです。
デニス






7

MATL、3バイト

oXs

MATLは、「ox」の複数形が「oxen」であることを知りません...

入力は、チャレンジテキストと同じ形式の数値行ベクトルのセル配列です。

{[1,2,3,4],[1],[5,2,3],[6,1]}

オンラインでお試しください!または、すべてのテストケースを確認します

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display

セルを使用するのが非常に賢い=)
flawr

4

JavaScript(ES6)、51 48バイト

ETHproductionsのおかげで3バイト節約

a=>a.map(b=>b.map((v,i)=>r[i]=~~r[i]+v),r=[])&&r

テストケース


何が問題だったのreduceですか?a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))45バイトのみです。
ニール

@Neilこれは、最終結果のサイズを最後に処理された配列のサイズに制限しませんか?
アーナルド

ああ、テストケースは私のエラーをキャッチできませんでした、ありがとう!
ニール


3

C ++ 14、130バイト

名前のない汎用ラムダとして:

[](auto C,auto&r){r.clear();int i=0,b=1;while(b--){r.push_back(0);for(auto c:C)r.back()+=i<c.size()?c[b=1,i]:0;++i;}r.pop_back();}

必要Cのようになりvector<vector<int>>、戻り値は、rのようになりvector<int>(に応じて大丈夫でなければなりませんメタ)。

ゴルフをしていない&使用法:

#include<vector>
#include<iostream>

auto f=
[](auto C, auto&r){
 r.clear();         //clearing r just to be sure
 int i=0,b=1;       //i is the position in the row, b is a boolean
 while(b--){        //while something was added
  r.push_back(0);   //add zero
  for(auto c:C)     //for each container
   r.back() += i<c.size() ?   //add to the last element 
    c[b=1,i] : 0;             //set b and get the element or zero 
  ++i;              
 }
 r.pop_back();      //remove last unnecessary zero
}
;

using namespace std;

int main(){
 vector<vector<int> > C = { {1,2,3,4}, {1}, {5,2,3}, {6,1} };
 vector<int> r; 
 f(C,r);
 for (int i: r)
  cout << i << ", ";
 cout << endl;
}


3

Haskell、61 41 40バイト

-20バイトの@ Laikoni、-1バイトの@nimiに感謝します!

f[]=[]
f l=sum[h|h:_<-l]:f[t:u|_:t:u<-l]

説明:これは、リストの最初の要素の再帰的な合計であり、すべての中間ステップで空のリストを破棄することにも対処しています。

    sum[h|h:_<-l]                    -- sums up all the first elemetns of the list
                    [t:u|_:t:u<-l]   -- removes the first element of all the list, and removes empty lists
                   f                 -- applies f to the remaining list
                 :                   -- prepends the sum to the rest

リスト内包表記を使用(sum$sum.(take 1)<$>l)するsum[h|h:_<-l](f$filter(/=[])$drop 1<$>l)、かなりのバイトを節約できますf[t|_:t<-l,t>[]]。とで置き換えることができます。
ライコニ16

どうもありがとうございます!私はパターンマッチングの可能性を忘れ続けてい[h|h:_<-l]ます!
flawr 16

再帰呼び出しで1バイトを保存できますf[t:u|_:t:u<-l]
nimi

2

J、5バイト

+/@:>

入力をリストのボックス化されたリストとして受け取ります。

テストケース

   1 ; 1 1 1 1
+-+-------+
|1|1 1 1 1|
+-+-------+
   (+/@:>) 1 ; 1 1 1 1
2 1 1 1
   1 ; 1 2 ; 1 2 3 ; 1 2 3 4
+-+---+-----+-------+
|1|1 2|1 2 3|1 2 3 4|
+-+---+-----+-------+
   (+/@:>) 1 ; 1 2 ; 1 2 3 ; 1 2 3 4
4 6 6 4



1

Java 8、124バイト

これは、のラムダ式です Function< int[ ][ ], int[ ] >

i->{int L=0,t,r[];for(int[]a:i)L=(t=a.length)>L?t:L;r=new int[L];for(;0>L--;)for(int[]a:i)r[L]+=a.length>L?a[L]:0;return r;}

入力から最大の配列長を取得し、そのサイズの新しい配列を作成してから、各列の合計を配列に書き込みます。


1

オクターブ、69バイト

@(a){g=1:max(s=cellfun(@numel,a))<=s';f=g'+0;f(g')=[a{:}];sum(f')}{4}

1

R、105 97バイト

a=c();l=length;for(i in 1:l(w)){length(w[[i]])=max(sapply(w,l));a=rbind(a,w[[i]])};colSums(a,n=T)

これは、次の形式でlist呼び出されるオブジェクトを入力に取り込みますw

w=list(c(1,2,3,4),c(1),c(1,2))

列ごとの合計を出力します。 [1] 3 4 3 4

この解決策は私には非常に長いです。Rには、異なる長さのベクトルをバインドしようとするときにリサイクルする特殊性があります。例えば ​​:

a=c(1,2,3,4)
b=c(1,2)

cbind(a,b)

     a b
[1,] 1 1
[2,] 2 2
[3,] 3 1
[4,] 4 2

b フィットするために一度再利用されるため、リストから始めます。

プログラムは、リストのすべての要素の長さを最も長いものとして調整し、要素をバインドして、列ごとの合計を計算します。長さ調整によりが生成NAされますが、これらは無視されますsum

@Jarko Dubbeldamのおかげで-8バイト


colSums(a,na.rm=T)数バイト節約します。
JAD

あなたも変えることができますna.rm=Tn=T
JAD

1

PHP、63バイト

<?foreach($_GETas$a)foreach($a as$i=>$x)$r[$i]+=$x;print_r($r);

入力のリストとしてGETパラメーターを使用してブラウザーで呼び出します。

例:(
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
配列名は無視されるため、任意の名前を付けることができます。)

テストのためにこの機能を試してください:

function s($a){foreach($a as$b)foreach($b as$i=>$x)$r[$i]+=$x;return$r;}

またはhttp_build_query($array,a)、指定された配列の配列をGETパラメーターに変換するために使用します。


0

Clojure、70バイト

#(for[i(range(apply max(map count %)))](apply +(for[v %](get v i 0))))

基本的なネストされたループ。


0

Japt、5バイト

Uz mx

オンラインでテストしてください!

Uは入力配列で、z配列では配列を時計回りに90度回転します。したがって、

[
 [1,2,3,4],
 [1      ],
 [5,2,3  ],
 [6,1    ]
]

になる

[
 [6,5,1,1],
 [1,2,  2],
 [  3,  3],
 [      4]
]

(間隔は表示目的でのみ追加されます。)

mx次にm、合計(x)でapsします[13,5,6,4]。これにより、目的の結果が得られます。

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