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.