Belirli bir boyuttaki tüm kare alt matrislerini oluşturma


14

Sen tamsayılar bir kare matris verilecektir M ve başka pozitif tam sayı n boyutundan daha sıkı küçük, M . Senin görevin n büyüklüğünde M'nin tüm kare alt matrislerini üretmektir .

Bu zorluğun amaçları doğrultusunda, bir kare alt matris , M'de bulunan bitişik sıralar ve sütunlardan oluşan bir gruptur .

Giriş / Çıkış Formatları

Diğer makul formatları seçmekte özgürsünüz, bunlar sadece bazı örneklerdir.

Giriş

  • Yerel matris türünde bir matris (dilinizde varsa)
  • Bir 2D dizi (her biri bir satıra / bir sütuna karşılık gelen 1D dizilerinden oluşan bir dizi)
  • 1D dizisi (matris her zaman kare olduğu için)
  • Bir dize (aralığı seçtiniz, ancak lütfen bunu herhangi bir şekilde kötüye kullanmayın) vb.

Çıktı

  • Bir matris matrisi.
  • Her bir öğenin (3B liste) bir satır / sütundaki alt matrisleri temsil ettiği bir 4D dizisi.
  • Her öğenin (2B liste) bir alt matrisi temsil ettiği bir 3B dizi.
  • Elde edilen alt matrislerin vb. Bir dize temsili.

gözlük

  • Sen kaldırmayı tercih edebilir boyutunu ait M de girdi olarak. En az 2 olması garanti edilir .
  • Çıktının yönü isteğe bağlıdır: alt matrisleri sütun veya satır listesi olarak çıkarmayı seçebilirsiniz, ancak seçiminizin tutarlı olması gerekir.
  • Herhangi bir programlama dilinde rekabet edebilir ve herhangi bir standart yöntemle girdi alabilir ve çıktı sağlayabilir , bu boşlukların varsayılan olarak yasaklandığını unutmayın .
  • Bu , bu nedenle her dil için en kısa gönderme (bayt cinsinden) kazanır.

Misal

Verilen n = 3 ve M :

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

Olası 3x3 alt matrisleri:

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

Sonuç şöyle olur:

[[[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]]]

Yukarıda belirtildiği gibi, bir çıktı:

[[[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]]]

bunun yerine alt matrisleri satır listesi olarak döndürmeyi seçerseniz de kabul edilebilir.

Test senaryoları

M, n girişleri :

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

Ve karşılık gelen çıktılar (satır listesi olarak verilen alt matrisler):

[[[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]]]

Veya sütun listeleri olarak:

[[[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]]]]

Korumalı alan yayını (artık silindi, yalnızca 2k'dan fazla üne sahip kullanıcılar görüntüleyebilir). Geri bildirimde bulunan herkese teşekkürler.
Bay Xcoder

Peki bu çıktı formatına izin veriliyor mu?
Luis Mendo

@LuisMendo Evet, izin verilir.
Bay Xcoder

Yanıtlar:


6

05AB1E , 8 bayt

2FεŒsù}ø

Çevrimiçi deneyin!

açıklama

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)

5

MATL , 4 bayt

thYC

Girdiler no zaman M.

Çıktı, her sütunun bir alt matrisin tüm sütunlarını içerdiği bir matristir.

Çevrimiçi deneyin!

açıklama

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

Daha ciddisi, tgiriş n'i dolaylı olarak alır ve yığına çoğaltır. n'ninh her iki kopyasını birleştirerek [n, n] dizisini üretir . M girişini dolaylı olarak alır , tüm [n, n] boyutlu bloklarını çıkarır ve bunları sütun-büyük sırada sütunlar olarak düzenler. Bu, her bir bloğun sütunlarının tek bir sütun oluşturacak şekilde dikey olarak istiflendiği anlamına gelir.YC


1
"Resmi, biraz eski moda zamir" için LOL +1 ve çok güzel bir golf.
Giuseppe

@Giuseppe Bu bir zamir değil, bir belirleyici olduğunu fark ettim: - /
Luis Mendo

Ben her zaman "seninkini" iyelik zamirleri olarak öğrendim; Bu benim bir belirleyiciyi ilk kez duymam!
Giuseppe

@Giuseppe "Thy / your" iyelik belirleyicileri, yani bir isimle gidiyorlar: "Bu senin araban". "Senin / senin" iyelik zamirleri, yani isim atlandı: "Bu senin". Ve başlangıçta "senin" i aslında "sen" olacak olan kişisel bir zamirle karıştırdım. Ne dağınıklık yaptım :-)
Luis Mendo

4

APL (Dyalog Unicode) , 26 bayt SBCS

Anonim infix lambda n'yi sol argüman, M ise sağ argüman olarak alıyor.

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

Çevrimiçi deneyin!

{} Anonim lambda sol argüman ve doğru argüman:

⊢⍵ Sağ argüman (verim ayırır ⍺ ⍺gelen )

⊢⌺⍺ ⍺kenarları üst üste binenler de dahil olmak üzere  tüm -by- alt matrisler (sıfırlarla doldurulmuş olanlar)

()↓ İlk iki boyuta aşağıdaki sayı öğelerini bırakın:

  ⍺÷2 yarısı

  ¯1+ negatif bir artı bu

   hesabı yuvarlamak

  2⍴ siklik r bir elementin bir listesine eshape

  s← mağaza siçin ( s hards)

  - olumsuzluk (yani arkadan düşme)

s↓sbirinci ve ikinci boyutlar boyunca önden düşme elemanları (önden)


4

APL (Dyalog Unicode) , 31 bayt

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

Çevrimiçi deneyin!

Adám'dan farklı bir yaklaşım.


(Tabii golf oynadıktan sonra) bir açıklama yapmak istiyor musunuz? Nasıl çalıştığını görmek isterdim (ve hiç APL bilmiyorum) :)
Emigna

@Emigna Evet, eğer zamanım olsaydı.
Outgolfer Erik

Çok zeki. Önemsiz durumlar için dyadic'i başarıyla kullanabiliyorsanız , dizi programlamaya gerçekten hakim oldunuz.
Adám

@ Adám Uh, bu cevabın aslında geçersiz olduğunu düşünmeme rağmen :-( EDIT: Sabit, ama şimdi 31 bayt uzunluğunda ...
Outgolfer Erik

Test paketini gönderimlerimden kopyalamaktan çekinmeyin.
Adám

3

R , 75 bayt

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

Çevrimiçi deneyin!

Alır M, Nve Smatris ize.

Sonuçtaki matrisleri stdout'a yazdırır; endekslemenin özniteliği düşürmemesi ve a yerine bir sonuç vermesi durumunda drop=Fgereklidir .N=1dimmatrixvector


3

J , 11 8 bayt

Mil sayesinde -3 bayt

<;._3~,~

Çevrimiçi deneyin!


1
Bu, 8 bayt <;._3~,~kullanır ve bunun yerine boyutu kendisiyle eşleştirmek için bir kanca kullanır, daha sonra bir matris matrisine çıktı olarak izin verildiğinden her birini keser ve kutular.
mil

@miles Teşekkürler, şimdi zarif!
Galen Ivanov


2

Jöle , 5 bayt

Z⁹Ƥ⁺€

4D çıkış biçimini kullanır. 3D için 6 bayt ekleyin .

Çevrimiçi deneyin!

Nasıl çalışır

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.

Sohbette user202729 benzeri bir şey önerdim. Alternatif bir 5 byter ṡ€Zṡ€.
Bay Xcoder

2

Brachylog , 13 bayt

{tN&s₎\;Ns₎}ᶠ

Çevrimiçi deneyin!

Bu sütun listelerini döndürür.

Teknik olarak, tN&s₎\;Ns₎çıktısını bu alt matrislerden herhangi biriyle birleştiren bir üretim yüklemidir. {…}ᶠSadece tüm olasılıkları ortaya çıkarmak için kullanıyoruz .

açıklama

 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

1

Stax , 10 bayt

│Æ☼♂Mqß E╖

Çalıştır

Aynı programın ascii temsili

YBFMyBF|PMmJ

Bu şekilde çalışır.

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

1

JavaScript (ES6), 91 bayt

Körili sözdiziminde girdi alır (a)(n). Sonuçları satır listeleri olarak döndürür.

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)

Test senaryoları


1

APL (Dyalog Klasik) , 24 23 bayt

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

Çevrimiçi deneyin!

sonuç bir matris matrisidir, ancak Dyalog'un çıktı biçimlendirmesi bunu çok açık hale getirmez

matrisi ( ) girin, her öğeyi kendi ( ⍪¨) iç içe matrisine dönüştürün , satır ( ,\) ve sütun ( ⍪⍀), n ( ) girişiyle önek birleşimlerini alın , iç içe matrislerin ilk n-1 satırlarını ve sütunlarını bırakın ( (¯1-t←-2⍴⎕)↓), her bir matristen ( t∘↑¨) alt sağ n-by-n köşesini alın ( )

                                        ┌─┬──┬───┐
                                        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      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘

0

Ruby , 63 bayt

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

Çevrimiçi deneyin!

Bu, bir 2D dizi ve bir 3D dizi döndüren bir int alan bir lambdadır.

Ungolfed:

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

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.