Suma kolumnowa


30

Biorąc pod uwagę niepustą listę niepustych wierszy liczb, oblicz mądrą kolumnę , która jest kolejną listą o długości najdłuższego wiersza wejściowego. Pierwszy wpis listy wyjściowej jest sumą wszystkich pierwszych wpisów w wierszach wejściowych, drugi to suma wszystkich drugich elementów (jeśli są dostępne) itp. Myślę, że poniższy przykład wyjaśni to znacznie lepiej:

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]

Przypadki testowe

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

Czy tablice będą zawierać tylko liczby całkowite?
ETHproductions

Do tej pory o tym nie myślałem, ale myślę, że można to założyć. Czy coś przemawia przeciwko temu?
flawr

Nie wydaje mi się Wszystkie twoje przypadki testowe używają tylko liczb całkowitych i jestem całkiem pewien, że nie unieważni to żadnych istniejących odpowiedzi (a może nawet zaoszczędzić bajty dla niektórych odpowiedzi).
ETHproductions

Myślę więc, że to założenie jest całkowicie do przyjęcia. Nie zmienia to również samego wyzwania.
flawr

Odpowiedzi:


19

Galaretka , 1 bajt

S

Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .

Jak to działa

Atom sumy Sjest skrótem od +/, który dokonuje redukcji przez dodanie.

Szybkość /zmniejsza się wzdłuż skrajnego wymiaru, więc nazywa swój link elementami wejściowymi. Tutaj elementami są rzędy.

Atom dodawania jest +wektoryzowany, więc dodanie dwóch wektorów wierszowych powoduje dodawanie element po elemencie. Gdy argumenty mają różne długości, elementy dłuższego argumentu, które nie mają odpowiednika w krótszym, pozostają niezmienione.

Podsumowując, z nieregularną macierzą jako argumentem, Soblicza sumę kolumnową, pomijając brakujące wpisy w krótszych wierszach.


1
Huh, spodziewałbym się, że będzie to suma rzędów, biorąc pod uwagę sposób, w jaki normalnie działa autowektoryzacja w Galaretce. Przyjmuję więc, że suma równa się wierszowi S€?

1
W przypadku tablicy 2D tak. /nie wektoryzuje; po prostu stosuje odpowiednią diadę do wszystkich elementów swojego argumentu.
Dennis,




8

Haskell, 34 bajty

import Data.List
map sum.transpose

Wypróbuj online! Stosowanie:

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

Dobrze wiedzieć o bibliotekach, zawsze boję się, importponieważ zjada już tak wiele bajtów: D
flawr

8

CJam , 7 5 bajtów

2 bajty wyłączone dzięki Dennisowi!

{:.+}

Definiuje to anonimowy blok, który pobiera listę list, na przykład [[1 2 3 4] [1] [5 2 3] [6 1]], i zastępuje ją listą,[13 5 6 4] .

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

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

7

MATL , 3 bajty

oXs

( MATL nie wie, że liczba mnoga „wół” to „woły” ... )

Dane wejściowe to tablica komórek numerycznych wektorów wierszy, w tym samym formacie, co w tekście wyzwania:

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

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

Bardzo sprytne w użyciu komórki =)
flawr

4

JavaScript (ES6), 51 48 bajtów

Oszczędność 3 bajtów dzięki produktom ETH

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

Przypadki testowe


Co było nie tak reduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))ma tylko 45 bajtów.
Neil,

@Neil Czy nie ograniczyłoby to rozmiaru wyniku końcowego do rozmiaru ostatniej przetworzonej tablicy?
Arnauld,

Ach, przypadki testowe nie wychwyciły mojego błędu, dzięki!
Neil,

3

Cud , 11 bajtów

@->#sum '#0

Transponuj i mapuj z funkcją sumowania. Stosowanie:

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

3

C ++ 14, 130 bajtów

Jako nienazwana ogólna lambda:

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

Wymaga Cbycia podobnym vector<vector<int>>i zwracania wartości rbycia podobnym vector<int>(powinno być w porządku zgodnie z meta ).

Niegolfowane i użytkowanie:

#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 bajtów

Dzięki @Laikoni za -20 bajtów, @nimi za -1 bajtów!

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

Objaśnienie: Jest to po prostu rekurencyjne podsumowanie pierwszych elementów listy, które dotyczy również odrzucania pustych list na każdym etapie pośrednim:

    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

Korzystanie listowych oszczędza sporo bajtów: Można wymienić (sum$sum.(take 1)<$>l)z sum[h|h:_<-l]i (f$filter(/=[])$drop 1<$>l)z f[t|_:t<-l,t>[]].
Laikoni

Wow dziękuję bardzo! Ciągle zapominam o możliwości dopasowania wzoru [h|h:_<-l]!
flawr

Jeden bajt może być zapisany w rekurencyjnego wywołania: f[t:u|_:t:u<-l].
nimi

2

J, 5 bajtów

+/@:>

Pobiera dane wejściowe jako zamkniętą listę list.

Przypadki testowe

   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 bajty

to jest wyrażenie lambda dla 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;}

pobiera największą długość tablicy z danych wejściowych, tworzy nową tablicę o tym rozmiarze, a następnie zapisuje sumy każdej kolumny do tablicy.


1

Oktawa, 69 bajtów

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

1

R 105 105 bajtów

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)

Spowoduje to wprowadzenie listobiektu o nazwie ww postaci:

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

Zwraca sumę kolumnową: [1] 3 4 3 4

To rozwiązanie jest dla mnie dość długie. R ma szczególny charakter do recyklingu, gdy próbujesz wiązać wektory o różnej długości. Na przykład :

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 jest ponownie używany raz, aby dopasować, dlatego zaczynam od listy.

Program dostosowuje długość wszystkich elementów listy jako jeden z najdłuższych, wiąże elementy i oblicza sumę według kolumn. Dostosowywanie długości powoduje NA, że są ignorowane przez sum.

-8 bajtów dzięki @Jarko Dubbeldam!


colSums(a,na.rm=T)oszczędza kilka bajtów.
JAD,

i można nawet włączyć na.rm=Tsię n=T.
JAD,

1

PHP, 63 bajty

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

wywołać w przeglądarce z parametrami GET jako listą danych wejściowych.

Przykład:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(Nazwy tablic są ignorowane, więc możesz nazwać je w dowolny sposób).

Wypróbuj tę funkcję do testowania:

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

lub użyj http_build_query($array,a)do konwersji danej tablicy tablic na parametry GET.


0

Clojure, 70 bajtów

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

Podstawowa pętla zagnieżdżona.


0

Japt, 5 bajtów

Uz mx

Przetestuj online!

Ujest tablicą wejściową, a zna tablicach obraca tablicę o 90 stopni zgodnie z ruchem wskazówek zegara. W związku z tym,

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

staje się

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

(Odstępy dodane tylko w celach wyświetlania).

mxNastępnie maps przez sumowanie ( x), który daje pożądane wyniki: [13,5,6,4].

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.