Soma em colunas

30

Dada uma lista não vazia de linhas de números não vazias, calcule a soma sábia da coluna , que é outra lista que possui o comprimento da linha de entrada mais longa. A primeira entrada da lista de saída é a soma de todas as primeiras entradas das linhas de entrada, a segunda é a soma de todos os segundos elementos (se disponíveis) etc. Acho que o exemplo a seguir explica melhor:

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]

Casos de teste

{[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]
flawr
fonte
As matrizes conterão apenas números inteiros?
ETHproductions
Eu não pensei nisso até agora, mas acho que você pode assumir isso. Há algo falando contra isso?
flawr
Acho que não. Todos os seus casos de teste usam apenas números inteiros e tenho certeza de que não invalidará nenhuma resposta existente (e pode até salvar bytes para algumas respostas).
ETHproductions
Bem, então eu acho que essa suposição é perfeitamente aceitável. Também não muda o desafio em si.
flawr

Respostas:

19

Geléia , 1 byte

S

Experimente online! ou verifique todos os casos de teste .

Como funciona

O átomo da soma Sé uma abreviação de +/, que realiza redução por adição.

O rápido /reduz ao longo da dimensão mais externa, por isso chama seu link para os elementos da entrada. Aqui, os elementos são as linhas.

O átomo de adição é +vetorizado, portanto, a adição de dois vetores de linha realiza a adição de elemento a elemento. Quando os argumentos têm comprimentos diferentes, os elementos do argumento mais longo que não têm contrapartida no menor são deixados inalterados.

Em Ssuma , com uma matriz irregular como argumento, calcula a soma em colunas, pulando as entradas ausentes nas linhas mais curtas.

Dennis
fonte
1
Huh, eu esperava que fosse uma soma em linhas, dada a maneira como a autovectorização normalmente funciona no Jelly. Presumo que a soma das linhas seria S€, então?
1
Para uma matriz 2D, sim. /não vetoriza; simplesmente aplica a díade correspondente a todos os elementos de seu argumento.
Dennis
11

Python 2 , 47 45 bytes

lambda x:map(lambda*y:sum(filter(None,y)),*x)

Obrigado a @vaultah por jogar fora 2 bytes!

Experimente online!

Dennis
fonte
9

Perl 6 , 23 bytes

{roundrobin(|$_)».sum}
smls
fonte
9

Mathematica, 15 bytes

Total@*PadRight
alefalpha
fonte
8

Haskell, 34 bytes

import Data.List
map sum.transpose

Experimente online! Uso:

Prelude Data.List> map sum.transpose $ [[1,2,3,4],[1],[5,2,3],[6,1]]
[13,5,6,4]
Laikoni
fonte
É bom conhecer as bibliotecas, sempre tenho medo do importque já consome tantos bytes: D
flawr
8

CJam , 7 5 bytes

2 bytes de desconto, graças a Dennis!

{:.+}

Isso define um bloco anônimo que pega uma lista de listas, como [[1 2 3 4] [1] [5 2 3] [6 1]], e o substitui por uma lista [13 5 6 4],.

Experimente online! Ou verifique todos os casos de teste .

Explicação

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

MATL , 3 bytes

oXs

( MATL não sabe que o plural de "boi" é "boi" ... )

Entrada é uma matriz de células de vetores de linhas numéricas, no mesmo formato que no texto do desafio:

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

Experimente online! Ou verifique todos os casos de teste .

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display
Luis Mendo
fonte
Muito inteligente de usar células =)
flawr
4

JavaScript (ES6), 51 48 bytes

Economizou 3 bytes, graças à ETHproductions

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

Casos de teste

Arnauld
fonte
O que havia de errado reduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))tem apenas 45 bytes.
Neil
@ Neil Isso não limitaria o tamanho do resultado final ao tamanho da última matriz processada?
Arnauld
Ah, os casos de teste falharam em capturar meu erro, obrigado!
19416 Neil
3

Maravilha , 11 bytes

@->#sum '#0

Transponha e mapeie com a função soma. Uso:

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

C ++ 14, 130 bytes

Como lambda genérico sem nome:

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

Requer Ca ser como vector<vector<int>>e valor de retorno ra ser como vector<int>(deve ser aprovado de acordo com a meta ).

Ungolfed & uso:

#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;
}
Karl Napf
fonte
3

Haskell, 61 41 40 bytes

Obrigado @Laikoni por -20 bytes, @nimi por -1 byte!

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

Explicação: É apenas um somatório recursivo dos primeiros elementos da lista, também lidando com o descarte de listas vazias em cada etapa intermediária:

    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
flawr
fonte
O uso da compreensão de lista economiza alguns bytes: Você pode substituir (sum$sum.(take 1)<$>l)por sum[h|h:_<-l]e (f$filter(/=[])$drop 1<$>l)por f[t|_:t<-l,t>[]].
Laikoni
Uau, muito obrigado! Eu continuo esquecendo a possibilidade de correspondência de padrões [h|h:_<-l]!
flawr
Um byte pode ser salvo na chamada recursiva: f[t:u|_:t:u<-l].
nimi
2

J, 5 bytes

+/@:>

Recebe a entrada como uma lista em caixa de listas.

Casos de teste

   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
Conor O'Brien
fonte
2

Dyalog APL , 3 bytes

+⌿↑

+⌿ soma coluna-sábio

o argumento misto (lista de lista, empilhado em matriz, preenchido com zeros)

TryAPL online!

Adão
fonte
2
Como diabos são esses 10 bytes?
Zacharý
3
@ZacharyT É o que acontece quando se usa um modelo às 12:30.
Adám
1

Java 8, 124 bytes

esta é uma expressão lambda para um 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;}

ele pega o maior comprimento da matriz da entrada, cria uma nova matriz desse tamanho e grava as somas de cada coluna na matriz.

Jack Munição
fonte
1

Oitava, 69 bytes

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

R, 105 97 bytes

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)

Isso recebe na entrada um listobjeto chamado wno formulário:

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

Ele gera a soma da coluna: [1] 3 4 3 4

Esta solução é bastante longa para mim. R tem a particularidade de reciclar quando você tenta vincular vetores de comprimento diferente. Por exemplo :

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 é reutilizado uma vez para caber, e é por isso que começo com uma lista.

O programa ajusta o comprimento de todos os elementos da lista como o mais longo, liga os elementos e calcula a soma da coluna. O ajuste do comprimento produz NA's, que são ignorados pelo sum.

-8 bytes graças a @Jarko Dubbeldam!

Frédéric
fonte
colSums(a,na.rm=T)salva alguns bytes.
JD:
e você pode até mesmo transformar na.rm=Tem n=T.
JD #
1

PHP, 63 bytes

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

chame no navegador com parâmetros GET como lista de entradas.

Exemplo:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(os nomes das matrizes são ignorados, para que você possa nomeá-los da maneira que desejar.)

Tente esta função para testar:

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

ou use http_build_query($array,a)para converter uma determinada matriz de matrizes em parâmetros GET.

Titus
fonte
0

Clojure, 70 bytes

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

Um loop aninhado básico.

NikoNyrh
fonte
0

Japt, 5 bytes

Uz mx

Teste online!

Ué a matriz de entrada e, znas matrizes, gira a matriz no sentido horário 90 graus. Assim sendo,

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

torna-se

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

(Espaçamento adicionado apenas para fins de exibição.)

mxem seguida, maps pelo somatório ( x), o que dá o resultado desejado: [13,5,6,4].

ETHproductions
fonte