Jumlah kolom-bijaksana

30

Diberikan daftar nonempty dari baris nonempty angka, hitung jumlah bijak kolom , yang merupakan daftar lain yang memiliki panjang baris input terpanjang. Entri pertama dari daftar keluaran adalah jumlah dari semua entires pertama dari baris input, yang kedua adalah jumlah dari semua elemen kedua (jika tersedia) dll. Saya pikir contoh berikut akan menjelaskannya dengan lebih baik:

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]

Uji Kasus

{[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]
cacat
sumber
Apakah array hanya berisi bilangan bulat?
ETHproductions
Saya tidak memikirkan hal itu sejauh ini tetapi saya pikir Anda dapat menganggap itu. Apakah ada yang menentang hal itu?
flawr
Saya kira tidak. Semua test case Anda hanya menggunakan bilangan bulat, dan saya cukup yakin itu tidak akan membatalkan jawaban yang ada (dan bahkan dapat menyimpan byte untuk beberapa jawaban).
ETHproductions
Kalau begitu saya pikir asumsi ini bisa diterima. Itu juga tidak mengubah tantangan itu sendiri.
flawr

Jawaban:

19

Jelly , 1 byte

S

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Atom penjumlahan Sadalah singkatan untuk +/, yang melakukan reduksi dengan penambahan.

Cepat /berkurang sepanjang dimensi terluar, sehingga ia memanggil tautannya untuk elemen-elemen input. Di sini, elemen-elemennya adalah baris.

Atom tambahan ini melakukan +vektorisasi, jadi menambahkan dua baris vektor melakukan penambahan elemen demi elemen. Ketika argumen memiliki panjang yang berbeda, elemen argumen yang lebih panjang yang tidak memiliki padanan dalam yang lebih pendek dibiarkan tidak berubah.

Semua dalam semua, dengan matriks tidak teratur sebagai argumen, Smenghitung jumlah kolom-bijaksana, melewatkan entri yang hilang di baris yang lebih pendek.

Dennis
sumber
1
Huh, saya berharap itu menjadi jumlah baris-bijaksana, mengingat cara autovectorisation biasanya bekerja di Jelly. Saya anggap jumlah baris-bijaksana akan S€, maka?
1
Untuk array 2D, ya. /tidak membuat vektor; itu hanya berlaku angka dua yang sesuai untuk semua elemen argumennya.
Dennis
11

Python 2 , 47 45 byte

lambda x:map(lambda*y:sum(filter(None,y)),*x)

Terima kasih kepada @vaultah karena bermain golf 2 byte!

Cobalah online!

Dennis
sumber
9

Perl 6 , 23 byte

{roundrobin(|$_)».sum}
seseorang
sumber
9

Mathematica, 15 byte

Total@*PadRight
alephalpha
sumber
8

Haskell, 34 byte

import Data.List
map sum.transpose

Cobalah online! Pemakaian:

Prelude Data.List> map sum.transpose $ [[1,2,3,4],[1],[5,2,3],[6,1]]
[13,5,6,4]
Laikoni
sumber
Baik untuk mengetahui perpustakaan, saya selalu takut importkarena sudah memakan banyak byte: D
flawr
8

CJam , 7 5 byte

2 byte off berkat Dennis!

{:.+}

Ini mendefinisikan blok anonim yang mengambil daftar daftar, seperti [[1 2 3 4] [1] [5 2 3] [6 1]], dan menggantinya dengan daftar [13 5 6 4],.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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

MATL , 3 byte

oXs

( MATL tidak tahu bahwa bentuk jamak dari "sapi" adalah "sapi" ... )

Input adalah array sel vektor baris numerik, dalam format yang sama seperti pada teks tantangan:

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

Cobalah online! Atau verifikasi semua kasus uji .

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display
Luis Mendo
sumber
Sangat pintar menggunakan sel =)
flawr
4

JavaScript (ES6), 51 48 byte

Disimpan 3 byte, berkat produk ETH

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

Uji kasus

Arnauld
sumber
Ada apa dengan itu reduce? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))hanya 45 byte.
Neil
@ Neil Bukankah itu membatasi ukuran hasil akhir ke ukuran array yang diproses terakhir?
Arnauld
Ah, kotak uji gagal menangkap kesalahan saya, terima kasih!
Neil
3

Bertanya-tanya , 11 byte

@->#sum '#0

Transpose dan petakan dengan fungsi penjumlahan. Pemakaian:

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

C ++ 14, 130 byte

Sebagai lambda generik yang tidak disebutkan namanya:

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

Harus Cseperti vector<vector<int>>dan mengembalikan nilai rseperti vector<int>(harus baik-baik saja sesuai dengan meta ).

Tidak digabungkan & penggunaan:

#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;
}
Karl Napf
sumber
3

Haskell, 61 41 40 byte

Terima kasih @Laikoni untuk -20 byte, @nimi untuk -1 byte!

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

Penjelasan: Ini hanya penjumlahan rekursif dari elemen pertama dari daftar, juga berurusan dengan membuang daftar kosong di setiap langkah perantara:

    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
cacat
sumber
Menggunakan daftar pemahaman menghemat beberapa byte: Anda dapat mengganti (sum$sum.(take 1)<$>l)dengan sum[h|h:_<-l]dan (f$filter(/=[])$drop 1<$>l)dengan f[t|_:t<-l,t>[]].
Laikoni
Wow terima kasih banyak! Saya selalu lupa tentang kemungkinan pencocokan pola di [h|h:_<-l]!
flawr
Satu byte dapat disimpan dalam panggilan rekursif: f[t:u|_:t:u<-l].
nimi
2

J, 5 byte

+/@:>

Mengambil input sebagai daftar daftar kotak.

Uji kasus

   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
Conor O'Brien
sumber
2

Dyalog APL , 3 byte

+⌿↑

+⌿ jumlah kolom-bijaksana

argumen campuran (daftar daftar, ditumpuk ke dalam matriks, padding dengan nol)

TryAPL online!

Adm
sumber
2
Bagaimana ini 10 byte?
Zacharý
3
@ ZakaryT Itulah yang terjadi saat menggunakan templat pada pukul 12:30 pagi.
Adám
1

Java 8, 124 byte

ini adalah ungkapan lambda untuk 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;}

dibutuhkan panjang array terbesar dari input, membuat array baru dengan ukuran itu, dan kemudian menulis jumlah masing-masing kolom ke array.

Jack Ammo
sumber
1

Oktaf, 69 byte

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

R, 105 97 byte

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)

Ini membutuhkan input listobjek yang disebut wdalam bentuk:

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

Ini menghasilkan jumlah kolom-bijaksana: [1] 3 4 3 4

Solusi ini cukup panjang untuk saya. R memiliki kekhasan untuk didaur ulang ketika Anda mencoba mengikat vektor dengan panjang yang berbeda. Sebagai contoh :

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 digunakan kembali sekali agar pas, itulah sebabnya saya mulai dengan daftar.

Program menyesuaikan panjang semua elemen daftar sebagai yang terpanjang, mengikat elemen-elemen dan menghitung jumlah kolom-bijaksana. Penyesuaian panjang menghasilkan NA, yang diabaikan oleh sum.

-8 byte terima kasih kepada @Jarko Dubbeldam!

Frédéric
sumber
colSums(a,na.rm=T)menghemat beberapa byte.
JAD
dan Anda bahkan bisa berubah na.rm=Tmenjadi n=T.
JAD
1

PHP, 63 byte

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

panggilan di browser dengan parameter GET sebagai daftar input.

Contoh:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(Nama array diabaikan, sehingga Anda dapat menamainya sesuka Anda.)

Coba fungsi ini untuk pengujian:

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

atau gunakan http_build_query($array,a)untuk mengonversi array array yang diberikan ke parameter GET.

Titus
sumber
0

Clojure, 70 byte

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

Loop bersarang dasar.

NikoNyrh
sumber
0

Japt, 5 byte

Uz mx

Uji secara online!

Uadalah array input, dan zpada array memutar array searah jarum jam sebesar 90 derajat. Karena itu,

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

menjadi

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

(Spasi ditambahkan hanya untuk tujuan tampilan.)

mxkemudian maps oleh penjumlahan ( x), yang memberikan hasil yang diinginkan: [13,5,6,4].

Produksi ETH
sumber