Сумма по столбцам

30

Учитывая непустой список непустых рядов чисел, вычислите мудрую сумму столбца , который является другим списком, у которого есть длина самой длинной входной строки. Первая запись в списке вывода - это сумма всех первых входов входных строк, вторая - сумма всех вторых элементов (если есть) и т. Д. Я думаю, что следующий пример объяснит это лучше:

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]

Тестовые случаи

{[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
источник
Будут ли в массивах только целые числа?
ETHproductions
Я не думал об этом до сих пор, но я думаю, что вы можете предположить это. Есть что-нибудь, что говорит против этого?
flawr
Я так не думаю. Во всех ваших тестовых случаях используются только целые числа, и я уверен, что это не сделает недействительными какие-либо существующие ответы (и может даже сохранить байты для некоторых ответов).
ETHproductions
Ну тогда я думаю, что это предположение вполне приемлемо. Это также не меняет сам вызов.
flawr

Ответы:

19

Желе , 1 байт

S

Попробуйте онлайн! или проверьте все контрольные примеры .

Как это работает

Атом суммы Sявляется сокращением для +/, которое выполняет сокращение путем сложения.

Быстрый /сокращается по внешнему измерению, поэтому он вызывает ссылку для элементов ввода. Здесь элементами являются строки.

Атом сложения +векторизуется, поэтому добавление двух векторов строк выполняет поэлементное сложение. Когда аргументы имеют разную длину, элементы более длинного аргумента, которые не имеют аналога в более коротком, остаются неизменными.

В общем, с нерегулярной матрицей в качестве аргумента, Sвычисляется сумма по столбцам, пропуская пропущенные записи в более коротких строках.

Деннис
источник
1
Да, я бы ожидал, что это будет сумма по строкам, учитывая то, как обычно работает автовекторизация в желе. Я так понимаю, построчно сумма будет S€, тогда?
1
Для двумерного массива да. /не векторизуется; он просто применяет соответствующую диаду ко всем элементам своего аргумента.
Деннис
8

Haskell, 34 байта

import Data.List
map sum.transpose

Попробуйте онлайн! Использование:

Prelude Data.List> map sum.transpose $ [[1,2,3,4],[1],[5,2,3],[6,1]]
[13,5,6,4]
Laikoni
источник
Приятно знать, библиотеки, я всегда боюсь, так importкак он уже съел столько байтов: D
flawr
8

CJam , 7 5 байтов

2 байта благодаря Деннису!

{:.+}

Это определяет анонимный блок, который принимает список списков, например [[1 2 3 4] [1] [5 2 3] [6 1]], и заменяет его списком [13 5 6 4].

Попробуйте онлайн! Или проверьте все тестовые случаи .

объяснение

{   }   e# Define block
 :      e# Fold over the following dyadic function
  .+    e# Vectorized addition
Луис Мендо
источник
7

MATL , 3 байта

oXs

( MATL не знает, что множественное число от "вол" - "волы" ... )

Input представляет собой массив ячеек числовых векторов строк в том же формате, что и в тексте запроса:

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

Попробуйте онлайн! Или проверьте все тестовые случаи .

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display
Луис Мендо
источник
Очень умно использовать клетки =)
flawr
4

JavaScript (ES6), 51 48 байт

Сохранено 3 байта благодаря ETHproductions

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

Контрольные примеры

Arnauld
источник
Что было не так с reduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))только 45 байтов.
Нил
@Neil Не ограничит ли это размер конечного результата размером последнего обработанного массива?
Арно
Ах, тесты не смогли поймать мою ошибку, спасибо!
Нил
3

Чудо , 11 байт

@->#sum '#0

Транспонировать и отображать с функцией суммы. Использование:

(@->#sum '#0)[[1 2 3 4];[1];[5 2 3];[6 1]]
Mama Fun Roll
источник
3

C ++ 14, 130 байт

Как называется неназванная общая лямбда:

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

Требуется Cбыть похожим vector<vector<int>>и возвращать значение, rчтобы быть похожим vector<int>(должно быть в порядке в соответствии с мета ).

Ungolfed & использование:

#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 байт

Спасибо @Laikoni за -20 байт, @nimi за -1 байт!

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

Объяснение: Это просто рекурсивное суммирование первых элементов списка, также имеющее дело с отбрасыванием пустых списков на каждом промежуточном шаге:

    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
источник
Использование списочного понимания экономит довольно много байтов: Вы можете заменить (sum$sum.(take 1)<$>l)на sum[h|h:_<-l]и (f$filter(/=[])$drop 1<$>l)на f[t|_:t<-l,t>[]].
Laikoni
Вау, большое спасибо! Я постоянно забываю о возможности сопоставления с образцом в [h|h:_<-l]!
Flawr
Один байт могут быть сохранены в рекурсивном вызове: f[t:u|_:t:u<-l].
Ними
2

J 5 байт

+/@:>

Принимает ввод в виде списка списков.

Контрольные примеры

   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

Дьялог АПЛ , 3 байта

+⌿↑

+⌿ сумма столбцов

смешанный аргумент (список списка, сложенный в матрицу, заполнение нулями)

Попробуй APL онлайн!

Адам
источник
2
Как на земле это 10 байтов?
Захари
3
@ZacharyT Вот что происходит при использовании шаблона в 12:30.
Адам
1

Java 8, 124 байта

это лямбда-выражение для 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;}

он берет наибольшую длину массива из входных данных, создает новый массив такого размера, а затем записывает суммы каждого столбца в массив.

Джек Боеприпасы
источник
1

Октава, 69 байт

@(a){g=1:max(s=cellfun(@numel,a))<=s';f=g'+0;f(g')=[a{:}];sum(f')}{4}
rahnema1
источник
1

R 105 97 байт

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)

Это принимает на вход listобъект, называемый wв форме:

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

Выводит сумму по столбцам: [1] 3 4 3 4

Это решение довольно долго для меня. R имеет особенность перерабатывать, когда вы пытаетесь связать векторы различной длины. Например :

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 используется один раз, чтобы соответствовать, поэтому я начинаю со списка.

Программа корректирует длину всех элементов списка как один из самых длинных, связывает элементы и вычисляет сумму по столбцам. Регулировка длины производит NAs, которые игнорируются sum.

-8 байт благодаря @Jarko Dubbeldam!

Фредерик
источник
colSums(a,na.rm=T)сохраняет несколько байтов.
JAD
и вы даже можете превратиться na.rm=Tв n=T.
JAD
1

PHP, 63 байта

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

вызов в браузере с GET параметрами в качестве списка входов.

Пример:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(имена массивов игнорируются, поэтому вы можете называть их по своему усмотрению.)

Попробуйте эту функцию для тестирования:

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

или используйте http_build_query($array,a)для преобразования данного массива массивов в параметры GET.

Titus
источник
0

Clojure, 70 байт

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

Основной вложенный цикл.

NikoNyrh
источник
0

Japt, 5 байт

Uz mx

Проверьте это онлайн!

Uявляется входным массивом, а zпри массивах поворачивает массив по часовой стрелке на 90 градусов. Следовательно,

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

становится

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

(Интервал добавлен только для отображения.)

mxзатем mAps путем суммирования ( x), что дает желаемый результат: [13,5,6,4].

ETHproductions
источник