Hasilkan semua sub-matriks persegi dengan ukuran tertentu

14

Anda akan diberi matriks persegi bilangan bulat M dan lain bilangan bulat positif n , ketat lebih kecil dari ukuran M . Tugas Anda adalah untuk menghasilkan semua sub-matriks persegi ukuran M n .

Untuk keperluan tantangan ini, sebuah sub-matriks persegi adalah kelompok yang berdekatan baris dan kolom yang terkandung dalam M .

Format Input / Output

Anda bebas memilih format wajar lainnya, ini hanya beberapa contoh.

Memasukkan

  • Matriks dalam jenis matriks asli (jika bahasa Anda memilikinya)
  • Array 2D (array array 1D, masing-masing sesuai dengan satu baris / satu kolom)
  • Array 1D (karena matriks selalu persegi)
  • String (Anda memilih spasi, tapi tolong jangan menyalahgunakan ini dengan cara apa pun), dll.

Keluaran

  • Matriks matriks.
  • Array 4D, di mana setiap elemen (daftar 3D) mewakili sub-matriks pada baris / kolom.
  • Array 3D, di mana setiap elemen (daftar 2D) mewakili sub-matriks.
  • Representasi string dari sub-matriks yang dihasilkan, dll.

Spesifikasi

  • Anda dapat memilih untuk mengambil ukuran dari M sebagai masukan juga. Dijamin minimal 2 .
  • Orientasi output sewenang-wenang: Anda dapat memilih untuk mengeluarkan sub-matriks sebagai daftar kolom atau daftar baris, tetapi pilihan Anda harus konsisten.
  • Anda dapat bersaing dalam bahasa pemrograman apa pun dan dapat mengambil input dan memberikan output melalui metode standar apa pun , sambil memperhatikan celah ini ini dilarang secara default.
  • Ini adalah , jadi pengiriman terpendek (dalam byte) untuk setiap bahasa menang.

Contoh

Diberikan n = 3 dan M :

 1 2 3 4
 5 6 7 8
 9 10 11 12
13 14 15 16

Kemungkinan pendatang 3x3 adalah:

+ ------- + + -------- + 1 2 3 4 1 2 3 4
| 1 2 3 | 4 1 | 2 3 4 | + -------- + + -------- +
| 5 6 7 | 8 5 | 6 7 8 | | 5 6 7 | 8 5 | 6 7 8 |
| 9 10 11 | 12 9 | 10 11 12 | | 9 10 11 | 12 9 | 10 11 12 |
+ ------- + + -------- + | 13 14 15 | 16 13 | 14 15 16 |
13 14 15 16 13 14 15 16 + -------- + + -------- +

Jadi hasilnya adalah:

[[[1, 2, 3], [5, 6, 7], [9, 10, 11]], [[2, 3, 4], [6, 7, 8], [10, 11, 12]], [[5, 6, 7], [9, 10, 11], [13, 14, 15]], [[6, 7, 8], [10, 11, 12], [14, 15, 16]]]

Seperti disebutkan di atas, output dari:

[[[1, 5, 9], [2, 6, 10], [3, 7, 11]], [[2, 6, 10], [3, 7, 11], [4, 8, 12]], [[5, 9, 13], [6, 10, 14], [7, 11, 15]], [[6, 10, 14], [7, 11, 15], [8, 12, 16]]]

juga dapat diterima, jika Anda memilih untuk mengembalikan sub-matriks sebagai daftar baris sebagai gantinya.

Uji kasus

Input M, n :

[[1,2,3],[5,6,7],[9,10,11]], 1
[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]], 3
[[100,-3,4,6],[12,11,14,8],[0,0,9,3],[34,289,-18,3]], 2
[[100,-3,4,6],[12,11,14,8],[9,10,11,12],[13,14,15,16]], 3

Dan output yang sesuai (sub-matriks diberikan sebagai daftar baris):

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,2,3],[5,6,7],[9,10,11]],[[2,3,4],[6,7,8],[10,11,12]],[[5,6,7],[9,10,11],[13,14,15]],[[6,7,8],[10,11,12],[14,15,16]]]
[[[100,-3],[12,11]],[[-3,4],[11,14]],[[4,6],[14,8]],[[12,11],[0,0]],[[11,14],[0,9]],[[14,8],[9,3]],[[0,0],[34,289]],[[0,9],[289,-18]],[[9,3],[-18,3]]]
[[[100,-3,4],[12,11,14],[9,10,11]],[[-3,4,6],[11,14,8],[10,11,12]],[[12,11,14],[9,10,11],[13,14,15]],[[11,14,8],[10,11,12],[14,15,16]]]

Atau, sebagai daftar kolom:

[[[1]],[[2]],[[3]],[[5]],[[6]],[[7]],[[9]],[[10]],[[11]]]
[[[1,5,9],[2,6,10],[3,7,11]],[[2,6,10],[3,7,11],[4,8,12]],[[5,9,13],[6,10,14],[7,11,15]],[[6,10,14],[7,11,15],[8,12,16]]]
[[[100,12],[-3,11]],[[-3,11],[4,14]],[[4,14],[6,8]],[[12,0],[11,0]],[[11,0],[14,9]],[[14,9],[8,3]],[[0,34],[0,289]],[[0,289],[9,-18]],[[9,-18],[3,3]]]
[[[100,12,9],[-3,11,10],[4,14,11]],[[-3,11,10],[4,14,11],[6,8,12]],[[12,9,13],[11,10,14],[14,11,15]],[[11,10,14],[14,11,15],[8,12,16]]]]
Tuan Xcoder
sumber
Posting Sandbox (sekarang dihapus, hanya pengguna dengan reputasi lebih dari 2k yang dapat melihatnya). Terima kasih kepada semua orang yang telah memberikan umpan balik.
Tn. Xcoder
Jadi apakah format output ini diperbolehkan?
Luis Mendo
@LuisMendo Ya, itu diizinkan.
Tn. Xcoder

Jawaban:

6

05AB1E , 8 byte

2FεŒsù}ø

Cobalah online!

Penjelasan

2F            # 2 times do:
  ε    }      # apply to each element in the input matrix (initially rows)
   Œsù        # get a list of sublists of size input_2
        ø     # transpose (handling columns on the second pass of the loop)
Emigna
sumber
5

MATL , 4 byte

thYC

Inputnya n, lalu M.

Outputnya adalah matriks, di mana setiap kolom berisi semua kolom submatrix.

Cobalah online!

Penjelasan

thY    % Address the compiler with a formal, slightly old-fashioned determiner
C      % Convert input to ouput

Lebih serius lagi, tmengambil input n secara implisit dan menggandakannya di stack. hmenggabungkan kedua salinan n , menghasilkan array [n, n] . YCmengambil input M secara implisit, mengekstrak semua blok [n, n] -ukurannya, dan mengaturnya sebagai kolom dalam urutan kolom-utama. Ini berarti bahwa kolom dari setiap blok ditumpuk secara vertikal untuk membentuk satu kolom.

Luis Mendo
sumber
1
LOL +1 untuk "kata ganti formal, sedikit kuno", dan golf yang sangat bagus.
Giuseppe
@ Giuseppe Saya baru sadar itu penentu, bukan kata ganti: - /
Luis Mendo
Yah, aku selalu belajar "kamu / kamu" sebagai kata ganti posesif; ini adalah pertama kalinya saya mendengar tentang seorang penentu!
Giuseppe
@Giuseppe "Mu / kamu" adalah penentu posesif, yaitu, mereka pergi dengan nama: "Ini mobilmu". "Mu / milikmu" adalah kata ganti posesif, yaitu nama dihilangkan: "Ini milikmu". Dan saya awalnya bingung "kamu" dengan kata ganti orang, yang sebenarnya akan "kamu". Kacau saya buat :-)
Luis Mendo
4

APL (Dyalog Unicode) , 26 byte SBCS

Infix lamban anonim mengambil n sebagai argumen kiri dan M sebagai argumen kanan.

{s↓(-s2⍴⌈¯1+⍺÷2)↓⊢⌺⍺ ⍺⊢⍵}

Cobalah online!

{} Lambda anonim di mana argumen kiri dan argumen kanan:

⊢⍵ menghasilkan argumen yang benar ( terpisah ⍺ ⍺dari )

⊢⌺⍺ ⍺ all- by- submatrices termasuk yang tumpang tindih tepinya (yang dilapis nol)

(... )↓ letakkan elemen angka berikut di sepanjang dua dimensi pertama:

  ⍺÷2 setengah dari

  ¯1+ satu negatif ditambah itu

   pembulatan

  2⍴ siklis r eshape ke daftar dua elemen

  s← simpan di s(untuk s hards)

  - negate (yaitu drop dari belakang)

s↓letakkan selemen di sepanjang dimensi pertama dan kedua (dari depan)

Adm
sumber
4

APL (Dyalog Unicode) , 31 byte

{(12 1 3 4⍉⊖)⍣(4×⌊⍺÷2)⊢⌺⍺ ⍺⊢⍵}

Cobalah online!

Pendekatan yang berbeda dari Adám.

Erik the Outgolfer
sumber
Apakah Anda bermaksud memberikan penjelasan (setelah selesai bermain golf tentu saja)? Saya akan tertarik untuk melihat cara kerjanya (dan saya tidak tahu APL sama sekali) :)
Emigna
@ Emigna Ya, jika saya punya waktu.
Erik the Outgolfer
Sangat pintar. Jika Anda berhasil menggunakan diad untuk kasus-kasus non-sepele, maka Anda telah benar-benar menguasai pemrograman array.
Adám
@ Adám Uh, meskipun saya pikir jawaban ini sebenarnya tidak valid :-( EDIT: Diperbaiki, tapi sekarang panjangnya 31 byte ...
Erik the Outgolfer
Jangan ragu untuk menyalin test suite dari kiriman saya.
Adám
3

R , 75 byte

function(M,N,S,W=1:N,g=N:S-N)for(i in g)for(j in g)print(M[i+W,j+W,drop=F])

Cobalah online!

Mengambil M,, Ndan ukuran Sdari matriks.

Mencetak matriks yang dihasilkan ke stdout; drop=Fdiperlukan agar dalam N=1hal pengindeksan tidak menjatuhkan dimatribut dan menghasilkan a matrixdaripada a vector.

Giuseppe
sumber
3

J , 11 8 byte

-3 byte berkat mil

<;._3~,~

Cobalah online!

Galen Ivanov
sumber
1
Ini menggunakan 8 byte <;._3~,~dan menggunakan hook sebagai gantinya untuk memasangkan ukuran dengan dirinya sendiri, kemudian memotong dan kotak masing-masing karena matriks matriks diizinkan sebagai output.
mil
@miles Terima kasih, sekarang elegan!
Galen Ivanov
2

Haskell , 67 byte

m#n|r<-[0..length m-n]=[take n.drop x<$>take n(drop y m)|x<-r,y<-r]

Cobalah online!

benar-benar manusiawi
sumber
Ups! Saya sudah terlambat :) 65 byte
Cristian Lupascu
2

Jelly , 5 byte

Z⁹Ƥ⁺€

Menggunakan format output 4D. Untuk 3D, tambahkan untuk 6 byte .

Cobalah online!

Bagaimana itu bekerja

Z⁹Ƥ⁺€  Main link. Left argument: M (matrix). Right argument: n (integer)

 ⁹Ƥ    Apply the link to the left to all infixes of length n.
Z        Zip the rows of the infix, transposing rows and columns.
   ⁺€  Map Z⁹Ƥ over all results.
Dennis
sumber
Saya menyarankan sesuatu yang mirip dengan user202729 dalam obrolan. Alternatif 5-byter adalah ṡ€Zṡ€.
Tn. Xcoder
2

Brachylog , 13 byte

{tN&s₎\;Ns₎}ᶠ

Cobalah online!

Ini mengembalikan daftar kolom.

Secara teknis, tN&s₎\;Ns₎adalah predikat pembangkit yang menyatukan outputnya dengan salah satu dari submatrices tersebut. Kita gunakan{…}ᶠ hanya untuk membuka semua kemungkinan.

Penjelasan

 tN&              Call the second argument of the input N
{          }ᶠ     Find all:
    s₎              A substring of the matrix of size N
      \             Transpose that substring
       ;Ns₎         A substring of that transposed substring of size N
Fatalisasi
sumber
1

Stax , 10 byte

│Æ☼♂Mqß E╖

Menjalankannya

Representasi ascii dari program yang sama adalah

YBFMyBF|PMmJ

Ini berfungsi seperti ini.

Y               Store the number in the y register
 B              Batch the grid into y rows each
  F             Foreach batch, run the rest of the program
   M            Transpose about the diagonal
    yB          Batch the transposed slices into y rows each
      F         Foreach batch, run the rest of the progoram
       |P       Print a blank line
         M      Transpose inner slice - restoring its original orientation
          mJ    For each row in the inner grid, output joined by spaces
rekursif
sumber
1

JavaScript (ES6), 91 byte

Mengambil input dalam sintaks currying (a)(n). Mengembalikan hasil sebagai daftar baris.

a=>n=>(g=x=>a[y+n-1]?[a.slice(y,y+n).map(r=>r.slice(x,x+n)),...g(a[x+n]?x+1:!++y)]:[])(y=0)

Uji kasus

Arnauld
sumber
1

APL (Dyalog Classic) , 24 23 byte

t∘↑¨(¯1-t←-2⍴⎕)↓,⍀⍪\⍪¨⎕

Cobalah online!

hasilnya adalah matriks matriks, meskipun format keluaran Dyalog tidak membuatnya begitu jelas

masukan matriks ( ), ubah setiap elemen menjadi matriks bersarangnya sendiri ( ⍪¨), ambil gabungan awalan dengan baris ( ,\) dan dengan kolom ( ⍪⍀), masukan n ( ), jatuhkan baris n-1 pertama dan kolom matriks bersarang () (¯1-t←-2⍴⎕)↓), ambil sudut kanan bawah demi sudut dari setiap matriks ( t∘↑¨)

                                        ┌─┬──┬───┐
                                        aababc      ┼──┼───┤        ┼──┼───┤
 n=2       ┌─┬─┬─┐      ┌─┬──┬───┐      ├─┼──┼───┤      ababc        ab bc
┌───┐      abc      aabbac      aababc      dedef        de ef
abc  ⍪¨  ├─┼─┼─┤  ,\  ├─┼──┼───┤  ⍪⍀  ddedef 1 1 ┼──┼───┤¯2 ¯2∘↑¨┼──┼───┤
def ---> def ---> ddeedf ---> ├─┼──┼───┤ ---> ababc  --->       
ghi      ├─┼─┼─┤      ├─┼──┼───┤      aababc      dedef        de ef
└───┘      ghi      gghhgi      ddedef      ghghi        gh hi
           └─┴─┴─┘      └─┴──┴───┘      gghghi      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘
ngn
sumber
0

Ruby , 63 byte

->c,g{n=c.size-g+1
(0...n*n).map{|i|c[i/n,g].map{|z|z[i%n,g]}}}

Cobalah online!

Ini adalah lambda yang mengambil array 2D dan int, mengembalikan array 3D.

Tidak Disatukan:

->m,n{
  a = m.size - n + 1     # The count of rows in m that can be a first row in a submatrix
  (0...a*a).map{ |b|     # There will be a*a submatrices
    m[b/a,n].map{ |r|    # Take each possible set of n rows
      r[b%a,n]           # And each possible set of n columns
    }
  }
}
benj2240
sumber
0

Python 2 , 91 byte

lambda a,n:(lambda R:[[r[i:i+n]for r in a[j:j+n]]for i in R for j in R])(range(len(a)+1-n))

Cobalah online!

Chas Brown
sumber
def f(a,n):R=range(len(a)+1-n);print[[r[i:i+n]for r in a[j:j+n]]for i in R for j in R]menghemat lima.
Jonathan Allan