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.