Сума по колонці


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]

Чи містять масиви лише цілі числа?
ETHproductions

Я про це не думав поки, але думаю, ви можете це припустити. Чи щось говорить проти цього?
дефект

Я не думаю, що так. Усі ваші тестові випадки використовують лише цілі числа, і я впевнений, що це не призведе до визнання недійсними жодних існуючих відповідей (і навіть може зберегти байти для деяких відповідей).
ETHproductions

Ну тоді я вважаю, що це припущення цілком прийнятне. Це також не змінює сам виклик.
flawr

Відповіді:


19

Желе , 1 байт

S

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

Атом суми S- це скорочення +/, яке виконує зменшення додаванням.

Швидкий /зменшується уздовж найбільшого розміру, тому він називає своє посилання на елементи введення. Тут елементами є рядки.

Атом додавання +векторизується, тому додавання двох векторів рядків виконує додавання елементів за елементами. Коли аргументи мають різну довжину, елементи більш тривалого аргументу, які не мають аналогів у коротшому, залишаються незмінними.

Загалом, неправильна матриця як аргумент, Sобчислює суму в стовпцях, пропускаючи пропущені записи у більш короткі рядки.


1
Так, я б очікував, що це буде рівнозначна сума, враховуючи те, як зазвичай працює автовекторизація в Jelly. Я вважаю, тоді це була б сумарна сума S€?

1
Для двовимірного масиву, так. /не векторизується; він просто застосовує відповідну діаду до всіх елементів свого аргументу.
Денніс





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 не знає, що множина "вол" - це "воли" ... )

Вхід - це масив комірок числових векторів рядків у тому ж форматі, що і в тексті виклику:

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

Дуже розумно використовувати клітини =)
недолік

4

JavaScript (ES6), 51 48 байт

Збережено 3 байти, завдяки ETHproductions

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

Тестові справи


Що було не так 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]]

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>(має бути нормально відповідно до мета ).

Безголовки та використання:

#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

Використання списків розуміння економить досить багато байтів: Ви можете замінити (sum$sum.(take 1)<$>l)на sum[h|h:_<-l]і (f$filter(/=[])$drop 1<$>l)на f[t|_:t<-l,t>[]].
Лайконі

Дуже дякую! Я постійно забуваю про можливість узгодження шаблону [h|h:_<-l]!
дефект

Один байт можуть бути збережені в рекурсивном виклик: 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



1

Java 8, 124 байти

це лямбда-вираз для a 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

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

Програма налаштовує довжину всіх елементів списку як одного з найдовших, прив'язує елементи та обчислює суму, що відповідає стовпцю. Регулювання довжини виробляє NA's, які ігноруються 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.


0

Clojure, 70 байт

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

Основна вкладена петля.


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.