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]

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.


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




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]

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

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

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


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

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;
}


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

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

2

Dyalog APL , 3 byte

+⌿↑

+⌿ jumlah kolom-bijaksana

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

TryAPL online!


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.


1

Oktaf, 69 byte

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

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!


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.


0

Clojure, 70 byte

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

Loop bersarang dasar.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.