Jumlahkan diagonal


19

Ambil matriks bilangan bulat positif sebagai input, dan hasilkan jumlah individu dari elemen pada garis diagonal melalui matriks.

Anda hanya akan menghitung garis yang turun secara diagonal dan ke kanan. Anda harus mulai dengan diagonal yang hanya berisi elemen kiri-bawah, lalu panjang-dua diagonal di atasnya (jika ada) dan seterusnya hingga diagonal yang hanya berisi elemen kanan atas, seperti yang digambarkan di bawah ini.

Contoh:

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

Format input dan output adalah opsional seperti biasa.

Ini adalah , jadi pengiriman terpendek di setiap bahasa akan menang.


Jawaban:


6

Haskell , 40 37 byte

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

Cobalah online! Penggunaan: (foldl1$(.(++z)).zipWith(+).(0:)) [[1,2,3],[4,5,6]].

Sunting: Terima kasih Ørjan Johansen untuk -3 byte!

Tidak Disatukan:

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

zadalah daftar angka nol tanpa batas. Dalam fkita lipat daftar daftar mdengan menggabungkan dua daftar dengan fungsi #. Dalam #daftar pertama sberisi jumlah kolom akumulasi sejauh ini dan daftar kedua tadalah baris baru yang harus ditambahkan. Kami menggeser ssatu elemen ke kanan dengan menambahkan nol ke depan dan menambahkan sdan tdengan elemen zipWith(+). Karena smungkin besar secara sewenang-wenang, kita harus mengisi tdengan cukup nol dengan menambahkan z.


Itu lebih pendek point-bebas: foldl1$(.(++z)).zipWith(+).(0:).
Ørjan Johansen

6

Mathematica, 53 54 byte

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

Fungsi murni mengambil 2D-array sebagai input dan mengembalikan daftar. (Entri tidak harus bilangan bulat atau genap.) Diagonal[#,k]Mengembalikan kdiagonal th di atas (atau di bawah, jika knegatif) diagonal utama. {k,-l@#,l@#&@@#}menghitung kisaran diagonal yang diperlukan berdasarkan dimensi array input. Dan Trjumlah entri masing-masing diagonal.


Alternatif dengan jumlah byte yang sama, tapi mungkin Anda bisa bermain golf lebih jauh? Tanda kurung itu terlihat buruk. Tr@Diagonal[m,#]&/@Range@@({-1,1}(Dimensions[m=#]-1))&
Martin Ender

5

MATL , 6 byte

T&XdXs

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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

Hanya ingin tahu: Apakah menurut Anda akan lebih baik secara keseluruhan s==sum(x(:)), daripada tetap berpegang pada konvensi MATLAB, seperti yang tampaknya dilakukan MATL?
Stewie Griffin

@StewieGriffin Saya terkadang memikirkan hal itu. Keraguan saya lebih di antara sum(x)dan sum(x,1). Untuk matriks x, fakta yang sum(x)berperilaku berbeda jika matriks memiliki 1 baris terkadang menjengkelkan. Tetapi pada akhirnya saya memutuskan untuk pergi dengan Matlab, sehingga kedua bahasa lebih dekat; dan menambahkan beberapa fun(x,1)fungsi untuk kasus yang paling umum
Luis Mendo

5

Jelly , 5 byte

0;+µ/

Cobalah online!

Bagaimana itu bekerja

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.

Hanya R pertama yang mengurangi memiliki satu elemen lebih sedikit; itu meningkat satu elemen lagi setiap baris.
Ørjan Johansen

Ini pintar ... tidak ŒD?
Erik the Outgolfer

@EriktheOutgolfer Sekali lagi, ŒDpemesanan aneh mencegahnya menjadi berguna.
Dennis

@ Dennis Lalu saya pikir saya akan membuat sesuatu yang tidak memiliki urutan aneh ... oh, mungkin 3 monad mungkin masuk.
Erik the Outgolfer

5

JavaScript (ES6), 65 58 byte

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

Varian 63-byte:a=>a.map(r=>r.map(v=>s[i]=~~s[i++]+v,i=--y),s=[],y=a.length)&&s
Arnauld

@Arnauld Saya setuju, membalikkan adalah langkah yang buruk. Tapi terlalu lama juga terlalu lama!
Neil

3

CJam , 22 21 byte

Disimpan 1 byte berkat Martin Ender

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

Blok anonim mengharapkan argumen di stack dan meninggalkan hasilnya di stack.

Cobalah online!

Bagaimana itu bekerja

_                   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 byte

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

Cobalah online!

Penjelasan

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 byte

+//.@|.

Cobalah online!

Ini cukup sederhana:

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

Garis terbalik miring adalah diagonal array, jadi ini hanya menjumlahkan diagonal.



1

Jelly , 8 byte

ŒDS€ṙZL$

Cobalah online!

Setengah dari kode tersebut digunakan untuk menempatkan hasilnya dalam urutan yang benar.

Bagaimana?

Œ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 byte

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

1

R, 45 byte

Fungsi yang tidak disebutkan namanya mengambil objek kelas-matriks sebagai input:

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

Menggunakan ide yang dijelaskan dalam jawaban ini .


Saya percaya aturan dalam tantangan ini memungkinkan Anda untuk menyingkirkan panggilan unname, tetapi ini adalah solusi yang luar biasa!
Giuseppe

1

Oktaf, 71 byte

Mengasumsikan A adalah matriks, misalnya:

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

Maka kita memiliki:

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

Perhatikan bahwa transposing matriks membalikkan urutan jumlah diagonal, yang menyimpan dua byte keseluruhan dalam for loop.

Keluaran:

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,:)),endmenghemat 6 byte. Oktaf dapat melakukan pengindeksan langsung dan penugasan sebaris. Sayangnya, dengan asumsi bahwa ada variabel di ruang kerja sebelum menjalankan kode tidak diperbolehkan, jadi saya pikir Anda harus menggunakan input, seperti ini membawanya kembali hingga 75 byte. Pendekatan yang bagus, jadi +1 dari saya :) Dan selamat datang di PPCG! =)
Stewie Griffin

Juga, zeros(m-1,m)bisa ditulis ~e(m-1,m), hemat 4 byte :) Rapi ya?
Stewie Griffin

0

Python, 126 byte

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))))

fhanya berfungsi pada bagian segitiga bawah, jadi saya memindahkannya dan mendapatkan bagian segitiga atas dengan cara itu. Tidak tahu mengapa ffungsi tidak bekerja untuk nilai negatif (saya berubah fmenjadi lebih pendek karena bagian untuk mendapatkan yang negatif tidak berfungsi).


Saya mendapatkan kesalahan untuk test case terakhir. tio.run/nexus/…
Dennis

0

C, 148 byte

Coba Online

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 Bytes

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

Tidak Disatukan:

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

Awk splits pada whitespace $nadalah nbidang ke-1 (1-diindeks); NFadalah jumlah bidang pada baris, NRadalah jumlah baris saat ini. Variabel yang tidak terdefinisi adalah 0 dan dibuat pada penggunaan pertama.


0

PHP, 86 byte

solusi ramah memori dalam dua varian:

<?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++];

mengambil input dari parameter skrip, menggunakan garis bawah sebagai pembatas;
gunakan pengaturan default (bukan default php.ini) atau coba online


0

Clojure, 81 byte

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

Cukup bertele-tele, karena ini berisi daftar dengan nol sehingga kita bisa menghitung jumlah kolom-bijaksana.


0

Mathematica 73 byte

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

Yang ini berfungsi untuk APA SAJA 2D-array mxn (tidak hanya nxn)
masukkan array di akhir kode seperti ini (kasus uji terakhir)

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

masukan dalam bentuk [{a, b, c, d ...}, {m, n}]

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.