Somme par colonne


30

Étant donné une liste non vide de lignes de nombres non vides, calculez la somme par colonne , qui est une autre liste qui a la longueur de la ligne d'entrée la plus longue. La première entrée de la liste de sortie est la somme de toutes les premières entrées des lignes d'entrée, la seconde est la somme de tous les seconds éléments (si disponibles) etc. Je pense que l'exemple suivant l'expliquera mieux:

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]

Cas de test

{[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]

Les tableaux contiennent-ils uniquement des entiers?
ETHproductions

Je n'y ai pas pensé jusqu'à présent mais je pense que vous pouvez le supposer. Y a-t-il quelque chose contre cela?
flawr

Je ne pense pas. Tous vos cas de test n'utilisent que des entiers, et je suis presque certain que cela n'invalidera aucune réponse existante (et peut même économiser des octets pour certaines réponses).
ETHproductions

Eh bien, je pense que cette hypothèse est parfaitement acceptable. Cela ne change pas non plus le défi lui-même.
flawr

Réponses:


19

Gelée , 1 octet

S

Essayez-le en ligne! ou vérifiez tous les cas de test .

Comment ça marche

L'atome somme Sest un raccourci pour +/, qui effectue la réduction par addition.

Le rapide se /réduit le long de la dimension la plus à l'extérieur, il appelle donc son lien pour les éléments de l'entrée. Ici, les éléments sont les lignes.

L'atome d'addition +vectorise, donc l'ajout de deux vecteurs de ligne effectue l'addition élément par élément. Lorsque les arguments ont des longueurs différentes, les éléments de l'argument le plus long qui n'ont pas d'équivalent dans le plus court ne sont pas modifiés.

Dans l'ensemble, avec une matrice irrégulière comme argument, Scalcule la somme par colonne, en sautant les entrées manquantes dans les lignes les plus courtes.


1
Huh, je m'attendais à ce que ce soit une somme par ligne, étant donné le fonctionnement normal de l'autovectorisation dans Jelly. Je suppose que la somme par ligne serait S€, alors?

1
Pour un tableau 2D, oui. /ne vectorise pas; il applique simplement la dyade correspondante à tous les éléments de son argument.
Dennis




8

Haskell, 34 octets

import Data.List
map sum.transpose

Essayez-le en ligne! Usage:

Prelude Data.List> map sum.transpose $ [[1,2,3,4],[1],[5,2,3],[6,1]]
[13,5,6,4]

Bon à savoir les bibliothèques, j'ai toujours peur du importcar il mange déjà tant d'octets: D
flawr

8

CJam , 7 5 octets

2 octets de réduction grâce à Dennis!

{:.+}

Ceci définit un bloc anonyme qui prend une liste de listes, telles que [[1 2 3 4] [1] [5 2 3] [6 1]], et la remplace par une liste [13 5 6 4],.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

{   }   e# Define block
 :      e# Fold over the following dyadic function
  .+    e# Vectorized addition

7

MATL , 3 octets

oXs

( MATL ne sait pas que le pluriel de "bœuf" est "bœufs" ... )

L'entrée est un tableau de cellules de vecteurs de lignes numériques, au même format que dans le texte du défi:

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

Essayez-le en ligne! Ou vérifiez tous les cas de test .

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

Cellules très intelligentes =)
flawr

4

JavaScript (ES6), 51 48 octets

Enregistré 3 octets, grâce à ETHproductions

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

Cas de test


Quel était le problème reduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))n'est que de 45 octets.
Neil

@Neil Cela ne limiterait-il pas la taille du résultat final à la taille du dernier tableau traité?
Arnauld

Ah, les cas de test n'ont pas compris mon erreur, merci!
Neil

3

Wonder , 11 octets

@->#sum '#0

Transposer et cartographier avec la fonction somme. Usage:

(@->#sum '#0)[[1 2 3 4];[1];[5 2 3];[6 1]]

3

C ++ 14, 130 octets

En tant que lambda générique sans nom:

[](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();}

Nécessite Cd'être similaire vector<vector<int>>et de renvoyer la valeur rpour être similaire vector<int>(devrait être correct selon la méta ).

Non golfé et utilisation:

#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 octets

Merci @Laikoni pour -20 octets, @nimi pour -1 octet!

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

Explication: il s'agit simplement d'un résumé récursif des premiers éléments de la liste, traitant également de l'élimination des listes vides à chaque étape intermédiaire:

    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

L'utilisation des compréhensions de liste économise pas mal d'octets: vous pouvez remplacer (sum$sum.(take 1)<$>l)par sum[h|h:_<-l]et (f$filter(/=[])$drop 1<$>l)par f[t|_:t<-l,t>[]].
Laikoni

Wow merci beaucoup! J'oublie toujours la possibilité de faire correspondre les motifs [h|h:_<-l]!
flawr

Un octet peut être enregistré dans l'appel récursif: f[t:u|_:t:u<-l].
nimi

2

J, 5 octets

+/@:>

Prend la saisie sous forme de liste encadrée de listes.

Cas de test

   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

2

Dyalog APL , 3 octets

+⌿↑

+⌿ somme par colonne

l'argument mixte (liste de liste, empilé dans la matrice, remplissage avec des zéros)

TryAPL en ligne!


2
Comment diable est ce 10 octets?
Zacharý

3
@ZacharyT C'est ce qui se passe lors de l'utilisation d'un modèle à 12h30.
Adám


1

Java 8, 124 octets

c'est une expression lambda pour un 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;}

il prend la plus grande longueur de tableau de l'entrée, crée un nouveau tableau de cette taille, puis écrit les sommes de chaque colonne dans le tableau.


1

Octave, 69 octets

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

1

R, 105 97 octets

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)

Cela prend en entrée un listobjet appelé wsous la forme:

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

Il génère la somme par colonne: [1] 3 4 3 4

Cette solution est assez longue pour moi. R a la particularité de recycler lorsque vous essayez de lier des vecteurs de longueur différente. Par exemple :

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 est réutilisé une fois pour s'adapter, c'est pourquoi je commence par une liste.

Le programme ajuste la longueur de tous les éléments de la liste comme l'un des plus longs, lie les éléments et calcule la somme par colonne. Le réglage de la longueur produit NAdes, qui sont ignorés par le sum.

-8 octets grâce à @Jarko Dubbeldam!


colSums(a,na.rm=T)enregistre quelques octets.
JAD

et vous pouvez même na.rm=Tdevenir n=T.
JAD

1

PHP, 63 octets

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

appeler dans le navigateur avec les paramètres GET comme liste d'entrées.

Exemple:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(Les noms de tableaux sont ignorés, vous pouvez donc les nommer comme vous le souhaitez.)

Essayez cette fonction pour tester:

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

ou utilisez http_build_query($array,a)pour convertir un tableau donné de tableaux en paramètres GET.


0

Clojure, 70 octets

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

Une boucle imbriquée de base.


0

Japt, 5 octets

Uz mx

Testez-le en ligne!

Uest le tableau d'entrée, et zsur les tableaux fait pivoter le tableau dans le sens horaire de 90 degrés. Par conséquent,

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

devient

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

(Espacement ajouté uniquement à des fins d'affichage.)

mxpuis maps par sommation ( x), ce qui donne le résultat souhaité: [13,5,6,4].

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.