Stagger, stack, sum

15

Terinspirasi oleh pertanyaan Stack Overflow ini .

Tantangan

Memasukkan

Array matriks persegi berisi bilangan bulat non-negatif.

Keluaran

Matriks kuadrat dibangun dari matriks input sebagai berikut.

Misalkan N×N menjadi ukuran dari setiap matriks input, dan P jumlah matriks input.

Untuk kejelasan, pertimbangkan contoh input matriks berikut ( N=2 , P=3 ):

 3   5
 4  10

 6   8
12  11

 2   0
 9   1
  1. Mulai dengan matriks input pertama.
  2. Geser matriks input kedua N −1 ke bawah dan N −1 ke kanan, sehingga entri kiri atasnya bertepatan dengan entri kanan bawah dari yang sebelumnya.
  3. Bayangkan yang kedua, geser matriks seolah-olah itu ditumpuk di atas yang pertama. Jumlahkan dua nilai pada entri kebetulan. Tulis nilai lainnya, dan isi entri yang tersisa dengan 0untuk mendapatkan (2N-1)×(2N-1) matriks. Dengan contoh input, hasilnya sejauh ini adalah

     3   5   0
     4  16   8
     0  12  11
    
  4. Untuk setiap matriks input yang tersisa, goyangkan itu sehingga kiri atas bertepatan dengan kanan bawah dari matriks hasil akumulasi sejauh ini. Dalam contoh ini, termasuk memberi masukan matriks ketiga

     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  5. Ouput adalah ((N-1)P+1)×((N-1)P+1) matriks diperoleh setelah memasukkan matriks input terakhir.

Aturan dan klarifikasi tambahan

  • N danP adalah bilangan bulat positif.
  • Anda bisa mengambil N dan P sebagai input tambahan.
  • Input dan output dapat diambil oleh apa pun yang wajar . Formatnya fleksibel seperti biasa.
  • Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun .Celah standar dilarang .
  • Kode terpendek dalam byte menang.

Kasus uji:

Dalam setiap kasus, matriks input ditampilkan terlebih dahulu, kemudian output.

  1. N=2 ,P=3 :

     3   5
     4  10
    
     6   8
    12  11
    
     2   0
     9   1
    
     3   5   0   0
     4  16   8   0
     0  12  13   0
     0   0   9   1
    
  2. N=2 ,P=1 :

     3   5
     4  10
    
     3   5
     4  10
    
  3. N=1 ,P=4 :

     4
    
     7
    
    23
    
     5
    
    39
    
  4. N=3 ,P=2 :

    11  11   8
     6   8  12
    11   0   4
    
     4   1  13
     9  19  11
    13   4   2
    
    11  11   8   0   0
     6   8  12   0   0
    11   0   8   1  13
     0   0   9  19  11
     0   0  13   4   2
    
  5. N=2 ,P=4 :

    14  13
    10   0
    
    13  20
    21   3
    
     9  22
     0   8
    
    17   3
    19  16
    
    14  13   0   0   0
    10  13  20   0   0
     0  21  12  22   0
     0   0   0  25   3
     0   0   0  19  16
    
Luis Mendo
sumber
Berapa lama solusi MATL Anda untuk ini?
Giuseppe
@ Giuseppe Saya belum mencobanya di MATL. Untuk kasus uji saya menggunakan kode MATLAB dari jawaban saya dalam pertanyaan terkait
Luis Mendo

Jawaban:

4

Jelly , 15 12 byte

⁹ṖŻ€ƒZƲ⁺+µ@/

Cobalah online!

Bagaimana itu bekerja

⁹ṖŻ€ƒZƲ⁺+µ@/  Main link. Argument: A (array of matrices)

         µ    Begin a monadic chain.
          @/  Reduce A by the previous chain, with swapped arguments.
                Dyadic chain. Arguments: M, N (matrices)
      Ʋ           Combine the links to the left into a monadic chain with arg. M.
⁹                 Set the return value to N.
 Ṗ                Pop; remove its last row.
     Z            Zip; yield M transposed.
    ƒ             Fold popped N, using the link to the left as folding function and
                  transposed M as initial value.
  Ż€                Prepend a zero to each row of the left argument.
                    The right argument is ignored.
       ⁺        Duplicate the chain created by Ʋ.
        +       Add M to the result.
Dennis
sumber
6

R , 88 81 byte

function(A,N,P,o=0*diag(P*(N-1)+1)){for(i in 1:P)o[x,x]=o[x<-1:N+i-1,x]+A[[i]];o}

Cobalah online!

Membawa satu listmatriks,A , N, dan P.

oBuat matriks nol yang diperlukan dan tambahkan elemen ke konten Ayang sesuai di dalam o.

Giuseppe
sumber
4

JavaScript (ES6), 102 byte

Mengambil input sebagai (n,p,a).

(n,p,a)=>[...Array(--n*p+1)].map((_,y,r)=>r.map((_,x)=>a.map((a,i)=>s+=(a[y-i*n]||0)[x-i*n]|0,s=0)|s))

Cobalah online!

Bagaimana?

0w

w=(n-1)×hal+1

(x,y)

sx,y=saya=0hal-1Sebuahsaya(x-saya×(n-1),y-saya×(n-1))

di mana sel yang tidak terdefinisi diganti dengan nol.

Arnauld
sumber
3

Python 2 , 124 byte

def f(m,N,P):w=~-N*P+1;a=[w*[0]for _ in' '*w];g=0;exec"x=g/N/N*~-N;a[x+g/N%N][x+g%N]+=m[x][g/N%N][g%N];g+=1;"*P*N*N;return a

Cobalah online!

ovs
sumber
3

Jelly , 12 byte

Z€Ż€’}¡"Jµ⁺S

Cobalah online!

Z€Ż€’}¡"Jµ⁺S
         µ    Everything before this as a monad.
          ⁺   Do it twice
Z€            Zip €ach of the matrices
        J     1..P
       "      Pair the matrices with their corresponding integer in [1..P] then apply the 
              following dyad:
  Ż€            Prepend 0 to each of the rows
      ¡         Repeat this:
    ’}          (right argument - 1) number of times
              Doing everything before µ twice adds the appropriate number of rows and
              columns to each matrix. Finally:
           S  Sum the matrices.

12 byte

J’0ẋ;Ɱ"Z€µ⁺S

Jika nol ekstra diizinkan ZŻ€‘ɼ¡)⁺Sadalah solusi 9 byte yang keren. TIO .

dylnan
sumber
2

Jelly , 20 byte

µ;€0Zð⁺0ṁ+ṚU$}ṚU+⁸µ/

Cobalah online!

Bah, Jelly punya sikap hari ini ...

Erik the Outgolfer
sumber
2

Pip , 37 byte

{i:0{Y#i-1aM:0RLyAL_i+:yZG#@aALa}Mai}

Fungsi yang mengambil daftar daftar daftar. Cobalah online!

DLosc
sumber
2

Python 2 , 124 byte

def f(A,N,P):M=N-1;R=G(M*P+1);return[[sum(A[k][i-k*M][j-k*M]for k in G(P)if j<N+k*M>i>=k*M<=j)for j in R]for i in R]
G=range

Cobalah online!

Chas Brown
sumber
1

Arang , 52 byte

≦⊖θE⊕×θηE⊕×θηΣEEη×θξ∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν§§§ζξ⁻ιν⁻λν

Cobalah online! Tautan adalah untuk versi kode yang verbose dan menyertakan dua byte untuk pemformatan yang dapat digunakan. Saya mulai dengan versi yang mengisi semua array dan kemudian menyimpulkannya tetapi saya bisa menjadikan versi ini lebih pendek. Penjelasan:

≦⊖θ

Mengurangi nilai input N.

E⊕×θηE⊕×θη

Hitung ukuran hasilnya (N-1)P+1 dan memetakan rentang implisit dua kali sehingga menghasilkan matriks hasil yang dicetak secara implisit.

ΣEEη×θξ

Peta pada rentang implisit di atas nilai input P dan kalikan setiap elemen dengan N-1. Lalu, petakan rentang yang dihasilkan dan jumlah hasil akhirnya.

∧¬∨∨‹ιν›ι⁺θν∨‹λν›λ⁺θν

Pastikan tidak ada indeks di luar kisaran.

§§§ζξ⁻ιν⁻λν

Diimbangi ke input asli untuk mengambil nilai yang diinginkan.

Neil
sumber