Sütun bilge toplamı


30

Boş olmayan numarasız satırların bir listesi göz önüne alındığında , en uzun girdi satırının uzunluğuna sahip olan başka bir liste olan sütun bilge toplamını hesaplayın . Çıkış listesinin ilk girişi, giriş satırlarının tüm ilk girişlerinin toplamı, ikincisi ise tüm ikinci elemanların toplamıdır (eğer varsa) vb. Aşağıdaki örneğin daha iyi açıklayacağını düşünüyorum:

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]

Test Kılıfları

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

Diziler yalnızca tamsayılar içerecek mi?
ETHProductions,

Bunu şimdiye kadar düşünmedim ama bunun üstesinden gelebileceğinizi düşünüyorum. Buna karşı konuşan bir şey var mı?
kusur

Sanmıyorum Tüm test durumlarınızda sadece tamsayılar kullanılıyor ve var olan cevapları geçersiz kılmayacağından eminim (hatta bazı cevaplar için baytları kurtarabilir).
ETHProductions,

O zaman bu varsayımın tamamen kabul edilebilir olduğunu düşünüyorum. Aynı zamanda mücadelenin kendisini değiştirmez.
kusur

Yanıtlar:


19

Jöle , 1 bayt

S

Çevrimiçi deneyin! veya tüm test durumlarını doğrulayın .

Nasıl çalışır

Toplam atom S, +/ilave olarak indirgeme yapan bir kısa yoldur .

Hızlı /, en dıştaki boyut boyunca azalır, bu yüzden girişin elemanları için linkini çağırır. Burada, elemanlar sıradır.

Ekleme atomu +vektörleşir, bu nedenle iki sıra vektörü eklemek, eleman-öge eklemesi gerçekleştirir. Argümanlar farklı uzunluklara sahip olduğunda, daha kısa argümanda kısa olanın karşılığı olmayan uzun argüman elemanları değiştirilmez.

Sonuç olarak, argüman olarak düzensiz bir matris Sile sütun satırındaki toplamı hesaplayarak eksik satırları daha kısa satırlarda atlar.


1
Huh, otomatik vektörleşmenin normalde Jelly'de çalışmasına bağlı olarak, satır bazında toplam olmasını beklerdim. O zaman satır başına toplamı olur S€, öyleyse?

1
2B dizi için evet. /vektörleşmez; sadece ilgili dyad'ı kendi argümanının tüm öğelerine uygular.
Dennis,




8

Haskell, 34 bayt

import Data.List
map sum.transpose

Çevrimiçi deneyin! Kullanımı:

Prelude Data.List> map sum.transpose $ [[1,2,3,4],[1],[5,2,3],[6,1]]
[13,5,6,4]

Kütüphaneleri bilmek güzel, importzaten çok fazla bayt
yemiş


7

MATL , 3 bayt

oXs

( MATL çoğul "öküz" in "öküz" olduğunu bilmiyor ... )

Giriş, meydan okuma metniyle aynı biçimde, sayısal satır vektörlerinden oluşan bir hücre dizisidir:

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

Çevrimiçi deneyin! Veya tüm test durumlarını doğrulayın .

     % Implicit input
o    % Convert cell array to a matrix, right-padding with zeros each row
Xs   % Sum of each column
     % Implicit display

Hücreleri kullanmak için çok zekice =)
kusur

4

JavaScript (ES6), 51 48 bayt

ETHproductions sayesinde 3 bayt kurtardı

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

Test durumları


Yanlış olan reduceneydi? a=>a.reduce((l,r)=>r.map((e,i)=>e+(l[i]||0)))sadece 45 bayttır.
Neil

@Neil Bu, nihai sonucun boyutunu son işlenen dizinin boyutuyla sınırlamaz mı?
Arnauld

Ah, test davaları hatamı bulamadı, teşekkürler!
Neil

3

Wonder , 11 bayt

@->#sum '#0

Toplama ve toplama fonksiyonu ile eşleştirin. Kullanımı:

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

3

C ++ 14, 130 bayt

Adsız genel lambda olarak:

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

Gerektirir Cgibi olmak vector<vector<int>>ve dönüş değeri rgibi olmak vector<int>göre (tamam olmalıdır meta ).

Ungolfed ve kullanım:

#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 bayt

-20 bayt için @Laikoni, -1 bayt için @nimi!

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

Açıklama: Bu sadece listenin ilk öğelerinin özyinelemeli bir özetidir, ayrıca her orta adımda boş listeleri atmakla ilgilidir:

    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

Liste anlama özelliğini kullanmak oldukça fazla bayt kazandırır: (sum$sum.(take 1)<$>l)ile sum[h|h:_<-l]ve (f$filter(/=[])$drop 1<$>l)ile değiştirebilirsiniz f[t|_:t<-l,t>[]].
Laikoni

Vay, çok teşekkür ederim! Desen eşleştirme olasılığını unutmaya devam ediyorum [h|h:_<-l]!
kusur

Bir bayt özyinelemeli çağrı kaydedilebilir: f[t:u|_:t:u<-l].
nimi

2

J, 5 bayt

+/@:>

Kutulu bir liste listesi olarak girdi alır.

Test durumları

   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 bayt

bu, bir lambda ifadesidir. 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;}

girdideki en büyük dizi uzunluğunu alır, bu boyutta yeni bir dizi oluşturur ve ardından her sütunun toplamını diziye yazar.


1

Octave, 69 bayt

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

1

R, 105 97 bayt

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)

Bu, girilen formda listadlandırılan nesneyi alır w:

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

Sütun bilge toplamını verir: [1] 3 4 3 4

Bu çözüm benim için oldukça uzun. R , farklı uzunluktaki vektörleri bağlamaya çalıştığınızda geri dönüşüm özelliğine sahiptir. Örneğin :

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 bir kez sığdırmak için tekrar kullanılır, bu yüzden bir listeyle başladım.

Program, listedeki tüm öğelerin uzunluğunu en uzun olanı olarak ayarlar, öğeleri birleştirir ve sütun-toplamı hesaplar. Uzunluk ayarı NA, ihmal edilenler tarafından üretilir sum.

@Jarko Dubbeldam sayesinde -8 bayt !


colSums(a,na.rm=T)birkaç bayt kaydeder.
JAD

ve hatta açabilirsiniz na.rm=Tiçine n=T.
JAD

1

PHP, 63 bayt

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

Giriş listesi olarak GET parametreleriyle tarayıcıda arayın.

Örnek:
script.php?a[]=1&a[]=2&a[]=3&a[]=4&b[]=1&c[]=5&c[]=2&c[]=3&d[]=6&d[]=1
(Dizi adları yok sayılır, böylece istediğiniz şekilde adlandırabilirsiniz.)

Test etmek için bu işlevi deneyin:

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

veya http_build_query($array,a)belirli bir dizi dizisini GET parametrelerine dönüştürmek için kullanın .


0

Clojure, 70 bayt

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

Temel bir iç içe döngü.


0

Japt, 5 bayt

Uz mx

Çevrimiçi test edin!

UGiriş dizisidir ve zdizilerde diziyi saat yönünde 90 derece döndürür. Bu nedenle,

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

olur

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

(Aralık, yalnızca görüntüleme amacıyla eklendi.)

mxDaha sonra mtoplamı ile (aps xistenen sonucu verir),: [13,5,6,4].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.