Jumlah dari matriks yang direplikasi

11

Diberikan daftar angka [ a 1 a 2 ... a n ] , hitung jumlah semua matriks Aᵢ di mana Aᵢ didefinisikan sebagai berikut ( m adalah maksimum semua aᵢ ):

       1  2  ⋯ (i-1) i (i+1) ⋯  n
     +----------------------------
 1   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 2   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
aᵢ   | 0  0  ⋯   0   aᵢ  aᵢ  ⋯  aᵢ
aᵢ₊₁ | 0  0  ⋯   0   0   0   ⋯  0
 .   . .  .      .   .   .      .
 .   . .  .      .   .   .      .
 m   | 0  0  ⋯   0   0   0   ⋯  0

Contoh

Diberikan input, [2,1,3,1]kami membangun matriks berikut:

[2 2 2 2]   [0 1 1 1]   [0 0 3 3]   [0 0 0 1]   [2 3 6 7]
[2 2 2 2] + [0 0 0 0] + [0 0 3 3] + [0 0 0 0] = [2 2 5 5]
[0 0 0 0]   [0 0 0 0]   [0 0 3 3]   [0 0 0 0]   [0 0 3 3]

Aturan dan I / O

  • Anda dapat menganggap inputnya tidak kosong
  • Anda dapat menganggap semua input tidak negatif (0≤)
  • input dapat berupa matriks, daftar, array 1 × n (atau n × 1) dll.
  • sama halnya dengan output dapat berupa matriks, daftar daftar, array dll.
  • Anda dapat mengambil dan mengembalikan input melalui format I / O standar apa pun
  • kiriman Anda mungkin merupakan program atau fungsi lengkap

Uji kasus

[0] -> [] or [[]]
[1] -> [[1]]
[3] -> [[3],[3],[3]]
[2,2] -> [[2,4],[2,4]]
[3,0,0] -> [[3,3,3],[3,3,3],[3,3,3]]
[1,2,3,4,5] -> [[1,3,6,10,15],[0,2,5,9,14],[0,0,3,7,12],[0,0,0,4,9],[0,0,0,0,5]]
[10,1,0,3,7,8] -> [[10,11,11,14,21,29],[10,10,10,13,20,28],[10,10,10,13,20,28],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,17,25],[10,10,10,10,10,18],[10,10,10,10,10,10],[10,10,10,10,10,10]]
ბიმო
sumber
Saya menduga ada perbedaan font atau sesuatu. Saya melihat Anda memutar kembali edit saya. Beginilah tampilannya bagi saya imgur.com/a06RH9r Ini adalah Chrome di Windows 10. Elips vertikal tidak dirender dalam monospace karena alasan tertentu, dan tidak sejajar dengan kolom. Itu sebabnya saya mengubahnya. Tapi saya rasa pasti terlihat berbeda di lingkungan yang berbeda.
rekursif
1
Jelas merupakan masalah font. Kedua revisi tersebut tidak selaras di layar saya.
Dennis
Bolehkah kita mengembalikan hasilnya ditransformasikan?
Adám
1
@ Adám: Saya akan mengatakan tidak untuk itu, namun jangan ragu untuk memasukkan solusi dalam posting Anda yang melakukannya.
ბიმო

Jawaban:

9

Jelly , 10 5 byte

ẋ"z0Ä

Cobalah online!

Bagaimana itu bekerja

ẋ"z0Ä  Main link. Argument: A (array)


       e.g. [2, 1, 3, 1]

ẋ"     Repeat each n in A n times.

       e.g. [[2, 2   ]
             [1      ]
             [3, 3, 3]
             [1      ]]

  z0   Zipfill 0; read the result by columns, filling missing elements with 0's.

        e.g. [[2, 1, 3, 1]
              [2, 0, 3, 0]
              [0, 0, 3, 0]]

    Ä  Take the cumulative sum of each row vector.

       e.g. [[2, 3, 6, 7]
             [2, 2, 5, 5]
             [0, 0, 3, 3]]
Dennis
sumber
4

R , 80 byte

n=sum((a=scan())|1);for(i in 1:n)F=F+`[<-`(matrix(0,max(a),n),0:a[i],i:n,a[i]);F

Cobalah online!

Mengambil input dari stdin; mencetak 0x1matriks untuk input 0, yang dicetak seperti

	[,1]

Giuseppe
sumber
3
Bagi mereka yang bertanya-tanya, Fadalah variabel global bawaan yang nilai awalnya adalah FALSE. Di sini ia dipaksa ke 0 dan digunakan sebagai nilai awal dari jumlah kumulatif. Jawaban ini menunjukkan alasan untuk tidak menggunakan Fdan Tkecuali dalam kode yang dirancang khusus untuk tidak pernah benar-benar digunakan!
ngm
4

Haskell , 70 66 51 byte

g x=[scanl1(+)[sum[n|n>=r]|n<-x]|r<-[1..maximum x]]

Cobalah online!

Laikoni
sumber
1
Sebagai teka-teki, ada versi 54 byte;)
ბიმო
1
@BMO Bagaimana kalau 51 byte?
Laikoni
Sangat bagus!
Milik
3

JavaScript (ES6), 88 79 byte

Pengembalian []untuk [0].

f=(a,y,b=a.map((_,x)=>a.map(c=>y>=c|x--<0?0:s+=c,s=0)|s))=>s?[b,...f(a,-~y)]:[]

Cobalah online!

Arnauld
sumber
3

APL (Dyalog Unicode) , 8 byte SBCS

Program lengkap. Anjurkan stdin untuk daftar, mencetak matriks ke stdout.

Menggunakan metode Dennis .

+\⍉↑⍴⍨¨⎕

Cobalah online!

 stdin

⍴⍨¨r eshape-selfie masing-masing

 mencampur daftar daftar ke dalam matriks, diisi dengan 0s

 mengubah urutan

+\ jumlah baris-bijaksana kumulatif

Tidak membuat perbedaan komputasi, sehingga berpotensi ditinggalkan dan \diubah menjadi jumlah kolom-bijaksana bukan baris-bijaksana.

Adm
sumber
2

Python 2 , 85 byte

lambda x:[[sum(n*(n>j)for n in x[:i+1])for i in range(len(x))]for j in range(max(x))]

Cobalah online!

tongkat
sumber
2

Oktaf , 64 byte

@(x,k=a=0*(x+(1:max(x))'))eval"for i=x;a(1:i,++k:end)+=i;end,a";

Cobalah online!

Penjelasan:

Lagi-lagi: Ekspresi dalam daftar argumen dan eval digunakan dalam satu fungsi :)

Ini diambil xsebagai input, dan menciptakan dua matriks identik yang diisi dengan nol, dengan dimensi k=a=zeros(length(x),max(x)). Ini dicapai dengan menambahkan vektor horizontal xdengan vektor vertikal dengan1:max(x) , secara implisit memperluas dimensi ke array 2D, kemudian mengalikannya dengan nol. ~(x+...)sayangnya tidak berfungsi, karena itu memaksa auntuk menjadi array logis di seluruh fungsi.

for i=xadalah loop yang dibuat untuk setiap iterasi i=x(1), lalu i=x(2)dan seterusnya. a(1:i,k++:end)adalah bagian dari matriks yang harus diperbarui untuk setiap iterasi. 1:iadalah pepatah vektor baris mana yang harus diperbarui. Jika i=0, maka ini akan menjadi vektor kosong, jadi tidak ada yang akan diperbarui, selain itu 1, 2 .... ++k:endmenambah kmatriks dengan satu, dan menciptakan rentang dari nilai pertama dari matriks ini ( 1,2,3...) dan hingga kolom terakhir dari amatriks. +=imenambahkan nilai saat ini ke a. end,amengakhiri loop dan output a.

Stewie Griffin
sumber
1

Java 10, 142 byte

a->{int l=a.length,i=0,j,s,m=0;for(int q:a)m=q>m?q:m;int[][]r=new int[m][l];for(;i<m;i++)for(j=s=0;j<l;j++)r[i][j]=s+=i<a[j]?a[j]:0;return r;}

Cobalah online.

a->{               // Method with integer-array parameter and integer-matrix return-type
  int l=a.length,  //  Length of the input-array
      i,j,         //  Index integers
      s,           //  Sum integer
  m=0;for(int q:a)m=q>m?q:m;
                   //  Determine the maximum of the input-array
  int[][]r=new int[m][l];
                   //  Result-matrix of size `m` by `l`
  for(;i<m;i++)    //  Loop `i` over the rows
    for(j=s=0;     //   Reset the sum to 0
        j<l;j++)   //   Inner loop `j` over the columns
      r[i][j]=s+=  //    Add the following to the sum `s`, add set it as current cell:
        i<a[j]?    //     If the row-index is smaller than the `j`'th value in the input:
         a[j]      //      Add the current item to the sum
        :          //     Else:
         0;        //      Leave the sum the same by adding 0
  return r;}       //  Return the result-matrix
Kevin Cruijssen
sumber
1

Pari / GP , 60 byte

a->matrix(vecmax(a),#a,i,j,vecsum([a[k]|k<-[1..j],a[k]>=i]))

Cobalah online!

alephalpha
sumber