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]

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.


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




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]

É 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

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

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


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

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;
}


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

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

2

Dyalog APL , 3 bytes

+⌿↑

+⌿ soma coluna-sábio

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

TryAPL online!


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.


1

Oitava, 69 bytes

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

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!


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.


0

Clojure, 70 bytes

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

Um loop aninhado básico.


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].

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.