Çaprazları topla


19

Giriş olarak pozitif tamsayıların bir matrisini alın ve matris boyunca diyagonal çizgilerdeki elemanların münferit toplamlarını çıkarın.

Sadece çaprazlama aşağı ve sağa doğru giden çizgileri sayacaksınız. Yalnızca sol alt öğeyi içeren diyagonal ile başlamalısınız, daha sonra (varsa) üstündeki iki uzunluk diyagonal ile aşağıda gösterildiği gibi yalnızca sağ üst öğeyi içeren diyagonalden başlamalısınız.

Misal:

Input:
 8   14    5    1
10    5    5    8
 6    6    8   10
15   15    4   11

Output:
15, 21, 20, 32, 29, 13, 1
(Diagonals: {{15},{6,15},{10,6,4},{8,5,8,11},{14,5,10},{5,8},{1}})

Input:
1
Output:
1

Input: 
1 5
Output:
1, 5

Input:
4
1

Output: 
1, 4

Input:
17    4    5
24   16    5
 9   24   10
 1   14   22
 1   21   24
 4    4   17
24   25   17

Output:
24, 29, 22, 39, 47, 70, 43, 9, 5

Giriş ve çıkış formatları her zamanki gibi isteğe bağlıdır.

Bu , bu yüzden her dilde en kısa teslim kazanmak kazanır.


Yanıtlar:


6

Haskell , 40 37 bayt

z=0:z
foldl1$(.(++z)).zipWith(+).(0:)

Çevrimiçi deneyin! Kullanımı: (foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]].

Düzenleme: -3 bayt için Ørjan Johansen'a teşekkürler!

Ungolfed:

z = 0:z
s#t = zipWith(+)(0:s)(t++z)
f m = foldl1 (#) m

zsonsuz sayıda sıfırın bir listesidir. Burada f, miki listeyi işlevle birleştirerek listeler listesi üzerinde katlanırız #. Olarak #birinci listeden skadar birikmiş kolon miktarda içerir ve ikinci liste teklenmelidir yeni satırdır. Biz vardiya sön ve öğeye göre eklenti bir sıfır ekleyerek sağa bir eleman sve tile zipWith(+). Çünkü skeyfi büyük olabilir, biz pad zorunda tekleyerek yeterli sıfırlarla z.


Yani kısa nokta-Ücretsizdir: foldl1$(.(++z)).zipWith(+).(0:).
Ørjan Johansen

6

Mathematica, 53 54 bayt

l=Length@#-1&;Tr@Diagonal[#,k]~Table~{k,-l@#,l@#&@@#}&

Bir 2D diziyi giriş olarak alan ve bir liste döndüren saf işlev. (Girişlerin tamsayı veya çift sayı olması gerekmez.) Ana diyagonalin üstündeki (veya negatifse alttaki) diyagonali Diagonal[#,k]döndürür . girdi dizisinin boyutlarına göre gereken köşegen aralığını hesaplar. Ve her bir diyagonalin girişlerini toplar.kk{k,-l@#,l@#&@@#}Tr


Aynı bayt sayısında alternatif, ama belki daha da golf olabilir? Bu parantezler kötü görünüyor. Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
Martin Ender

5

MATL , 6 bayt

T&XdXs

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

açıklama

T&Xd   % All diagonals of implicit input arranged as zero-padded columns
Xs     % Sum of each column. Implicitly display

Sadece merak ediyorsun: s==sum(x(:))MATLAB sözleşmesine bağlı kalmak yerine, MATL'nin yaptığı gibi genel olarak daha iyi olacağını düşünüyor musunuz ?
Stewie Griffin

@StewieGriffin Bazen bunu düşündüm. Şüphem daha fazla sum(x)ve arasındaydı sum(x,1). Bir matris için x, sum(x)matrisin 1 satırı varsa farklı davranması bazen sinir bozucu olabilir. Ama sonunda Matlab ile gitmeye karar verdim, bu yüzden iki dil daha yakın; ve fun(x,1)en sık karşılaşılan durumlar için bazı işlevler ekler
Luis Mendo

5

Jöle , 5 bayt

0;+µ/

Çevrimiçi deneyin!

Nasıl çalışır

0;+µ/  Main link. Argument: M (matrix / array of rows)

   µ   Combine all links to the left into a chain (arity unknown at parse time) and
       begin a new monadic chain.
    /  Reduce M by that chain. This makes the chain dyadic.
       Let's call the arguments of the chain L and R (both flat arrays).
0;         Prepend a 0 to L.
  +        Perform element-wise addition of the result and R.
           When the chain is called for the n-th time, R has n less elements, so
           the last n elements of L won't have matching elements in R and will be
           left unaltered.

Sadece azaltılan ilk R'nin bir tane daha az elemanı vardır; her satırda bir öğe daha artar.
Ørjan Johansen

Bu sadece akıllı ... hayır ŒD?
Outgolfer Erik

@EriktheOutgolfer Bir kez daha ŒDgarip siparişleri faydalı olmasını engelledi.
Dennis

@Dennis O zaman çok garip bir siparişi olmayan bir şey yapacağımı düşünüyorum ... oh, belki 3 monad geliyor olabilir .
Outgolfer Erik

5

JavaScript (ES6), 65 58 bayt

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

63 baytlık varyant:a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
Arnauld

@ Kabul edebilir miyim, tersine çevirmek kötü bir hareketti. Ama bu uzunluğu almak da çok uzun!
Neil

3

CJam , 22 21 bayt

Martin Ender sayesinde 1 bayt kurtarıldı

{_,({0\f+}*ee::m<:.+}

Anonim blok yığındaki bağımsız değişkeni bekler ve sonucu yığına bırakır.

Çevrimiçi deneyin!

Nasıl çalışır

_                   e# Duplicate the matrix
 ,(                 e# Get its length (# of rows) minus 1
   {0\f+}*          e# Prepend that many 0s to each row
          ee        e# Enumerate; map each row to [index, row]
            ::m<    e# Rotate each row left a number of spaces equal to its index
                :.+ e# Sum each column

2

05AB1E , 17 bayt

Rvy¹gÅ0«NFÁ}})øO¨

Çevrimiçi deneyin!

açıklama

R                  # reverse input
 v                 # for each N,y (index, item)
  y¹gÅ0«           # pad y with as many zeroes as the number of rows in the input
        NFÁ}       # rotate each row N times right
            })     # wrap the result in a list
              øO   # sum the columns
                ¨  # remove the last element of the resulting list (the padded zeroes)

2

J , 7 bayt

+//.@|.

Çevrimiçi deneyin!

Bu oldukça basit:

+//.@|.
+/        sum
  /.      on oblique lines
    @|.   on the reversed array

Eğik ters çizgiler dizinin köşegenleridir, bu sadece köşegenleri toplamaktır.



1

Jöle , 8 bayt

ŒDS€ṙZL$

Çevrimiçi deneyin!

Kodun yarısı, sonuçları doğru sıraya koymak için kullanılır.

Nasıl?

ŒDS€ṙZL$ - Main link: list of lists of numbers
ŒD       - diagonals (starts with the diagonal containing the top left element,
         -            then the next diagonal to the right, and so on wrapping around)
  S€     - sum €each
       $ - last two links as a monad
     Z   - transpose the matrix
      L  - length (width of the matrix)
    ṙ    - rotate the results left by that amount

1

Perl 5, 47 bayt

map{$j=--$.;map{@a[$j++]+=$_}split}<>
print"@a"

1

R, 45 bayt

Matrix sınıfı bir nesneyi girdi olarak alan adsız işlev:

function(x)sapply(split(x,col(x)-row(x)),sum)

Bu cevapta açıklanan fikri kullanarak .


Bu meydan okumadaki kuralların, çağrıdan kurtulmanıza izin verdiğine inanıyorum unname, ancak bu ne olursa olsun harika bir çözüm!
Giuseppe

1

Oktav, 71 bayt

A'nın bir matris olduğunu varsayalım, örneğin:

A = [17 4 5;24 16 5; 9 24 10; 1 14 22; 1 21 24; 4 4 17;24 25 17];

Sonra elimizde:

[m,n]=size(A);
a=[zeros(m,m-1),A]';
for i=1:m+n-1
trace(a(i:end,:))
end

Matrisin transpozisyonunun, for döngüsünde toplam iki bayt kaydeden diyagonal toplamların sırasını tersine çevirdiğine dikkat edin.

Çıktı:

ans =  24
ans =  29
ans =  22
ans =  39
ans =  47
ans =  70
ans =  43
ans =  9
ans =  5

1
[m,n]=size(A);for i=1:m+n-1,trace([zeros(m-1,m);A'](i:end,:)),end6 bayt tasarruf sağlar. Octave doğrudan indeksleme ve satır içi atamalar yapabilir. Ne yazık ki, ben kullanmak gerektiğini düşünüyorum böylece kod çalıştırmadan önce çalışma alanı içinde değişken bir exist, izin verilmeyen varsayarak inputgibi bu 75 bayt yedeklemek getiren. Güzel bir yaklaşım olsa da, benden +1 :) Ve PPCG hoş geldiniz! =)
Stewie Griffin

Ayrıca, zeros(m-1,m)yazılabilir ~e(m-1,m), 4 bayt tasarruf :) Düzgün ha?
Stewie Griffin

0

Python, 126 bayt

x=input()
f=lambda k:[x[i+k][i]for i in range(len(x)-k)]
a=map(f,range(4)[::-1])
x=zip(*x)
print(map(sum,a+map(f,range(1,4))))

fsadece alt üçgen kısımda çalışır, bu yüzden onu aktarırım ve üst üçgen kısmı bu şekilde alırım. fFonksiyonun neden negatif değerler için çalışmadığını bilmiyorum ( fdaha kısa olarak değiştim çünkü negatifleri alma kısmı işe yaramadı).


Son test durumu için bir hata alıyorum. tio.run/nexus/…
Dennis

0

C, 148 bayt

Çevrimiçi Deneyin

s;g(int i,int j,int**m,int x){for(s=0;x;x--)s+=m[i++][j++];printf(" %d",s);}
k;f(int n,int**m){for(k=n;--k;)g(k,0,m,n-k);for(;k<n;k++)g(0,k,m,n-k);}


0

Awk, 67 Bayt

{for(f=0;f++<NF;)s[NF-NR+f]+=$f}END{i=0;while(i++<NR*2)print s[i]}

Ungolfed:

{
    for (f = 0; f++ < NF;)
        s[NF-NR+f] += $f
}
END {
    i = 0
    while (i++ < NR*2)
        print s[i]
}

Awk boşluk böler $nolan ninci alanı (1 endeksli); NFsatırdaki NRalan sayısı, geçerli satırın sayısıdır. Tanımsız değişkenler 0'dır ve ilk kullanımda oluşturulur.


0

PHP, 86 bayt

iki çeşit bellek dostu çözüm:

<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=0,$d=$c;$d--;)$s+=$a[$i+$d][$d];
<?for($i=$c=count($a=$_GET);--$i>-$c;print$s._)for($s=$d=0;$d<$c;)$s+=$a[$i+$d][$d++];

kod parametrelerinden girdi alır, ayırıcı olarak alt çizgi kullanır;
varsayılan ayarları kullanın (varsayılan php.ini değil) veya çevrimiçi deneyin


0

Clojure, 81 bayt

#(apply map +(map(fn[i c](concat(repeat(-(count %)i 1)0)c(repeat i 0)))(range)%))

Sütun toplamı hesaplayabilmemiz için sıfırlarla listeler gibi oldukça ayrıntılı.


0

mathematica 73 bayt

Plus@@@Table[Diagonal[Partition[#1,#2[[1]]],k],{k,-#2[[2]]+1,#2[[1]]-1}]&

Bu
, kodun sonundaki diziyi (son test durumu) herhangi bir 2D dizi mxn (sadece nxn değil) girişi için çalışır

[{17,4,5,24,16,5,9,24,10,1,14,22,1,21,24,4,4,17,24,25,17},{3,7}]

{24, 29, 22, 39, 47, 70, 43, 9, 5}

[{a, b, c, d ...}, {m, n}] biçiminde girdi

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.