Wygeneruj wszystkie kwadratowe sub-macierze o danym rozmiarze

14

Można otrzymać kwadratową macierz liczb M i innymi dodatniej liczby całkowitej N , bezwzględnie mniejsze niż rozmiar M . Twoim zadaniem jest wygenerowanie wszystkich kwadratowych podmacierzy M o rozmiarze n .

Dla celów niniejszego wyzwanie, kwadratowy pod-macierzą jest grupą sąsiednich rzędach i kolumnach zawarte w M .

Formaty wejścia / wyjścia

Możesz dowolnie wybierać inne rozsądne formaty, to tylko niektóre przykłady.

Wejście

  • Macierz w rodzimym typie macierzy (jeśli twój język ma taki)
  • Tablica 2D (tablica tablic 1D, każda odpowiadająca jednemu wierszowi / jednej kolumnie)
  • Tablica 1D (ponieważ macierz jest zawsze kwadratowa)
  • Sznurek (wybrałeś odstępy, ale nie nadużywaj go w żaden sposób) itp.

Wynik

  • Macierz macierzy.
  • Tablica 4D, w której każdy element (lista 3D) reprezentuje podmacierze w rzędzie / kolumnie.
  • Tablica 3D, w której każdy element (lista 2D) reprezentuje podmacierz.
  • Reprezentacja ciągu wynikowych podmacierzy itp.

Okular

  • Możesz wybrać, aby mieć rozmiar z M jak wejście zbyt. Gwarantuje to co najmniej 2 .
  • Orientacja danych wyjściowych jest dowolna: możesz wybrać wyświetlanie podmacierzy jako list kolumn lub list wierszy, ale twój wybór musi być spójny.
  • Możesz konkurować w dowolnym języku programowania i możesz przyjmować dane wejściowe i generować dane wyjściowe za pomocą dowolnej standardowej metody , zwracając uwagę, że te luki są domyślnie zabronione.
  • To jest , więc wygrywa najkrótsze przesłanie (w bajtach) dla każdego języka .

Przykład

Biorąc pod uwagę n = 3 i M :

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

Możliwe podmacierze 3x3 to:

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

Rezultatem byłoby:

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

Jak wspomniano powyżej, wynik:

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

byłoby również do przyjęcia, jeśli zamiast tego zdecydujesz się zwrócić podmacierze jako listy wierszy.

Przypadki testowe

Wejścia 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

I odpowiednie wyniki (podmacierze podane jako listy wierszy):

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

Lub jako listy kolumn:

[[[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]]]]
Pan Xcoder
źródło
Wpis w piaskownicy (teraz usunięty, tylko użytkownicy o reputacji ponad 2k mogą go zobaczyć). Dziękujemy wszystkim, którzy wyrazili opinię.
Pan Xcoder,
Czy ten format wyjściowy jest dozwolony?
Luis Mendo,
@LuisMendo Tak, jest dozwolone.
Pan Xcoder,

Odpowiedzi:

6

05AB1E , 8 bajtów

2FεŒsù}ø

Wypróbuj online!

Wyjaśnienie

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
źródło
5

MATL , 4 bajty

thYC

Dane wejściowe są nzatem M.

Dane wyjściowe to macierz, w której każda kolumna zawiera wszystkie kolumny podmacierzy.

Wypróbuj online!

Wyjaśnienie

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

Mówiąc poważniej, tbierze domyślnie dane wejściowe n i kopiuje je na stosie. hkonkatenuje obie kopie n , tworząc tablicę [n, n] . YCprzyjmuje niejawnie dane wejściowe M , wyodrębnia wszystkie bloki o rozmiarze [n, n] i układa je jako kolumny w porządku głównym kolumny. Oznacza to, że kolumny każdego bloku są ułożone pionowo w celu utworzenia pojedynczej kolumny.

Luis Mendo
źródło
1
LOL +1 za „formalny, nieco staromodny zaimek” i bardzo fajny golf.
Giuseppe
@Giuseppe Właśnie zdałem sobie sprawę, że to determinator, a nie zaimek: - /
Luis Mendo
Cóż, zawsze uczyłem się „twój / twój” jako zaimki dzierżawcze; to moje pierwsze przesłuchanie w sprawie determinatora!
Giuseppe,
@Giuseppe „Thy / your” są determinantami dzierżawczymi, tzn. Mają nazwę: „To jest twój samochód”. „Twoje / twoje” to zaimki dzierżawcze, to znaczy nazwa jest pomijana: „To jest twoje”. I początkowo pomyliłem „twój” z zaimkiem osobistym, którym w rzeczywistości byłby „ty”. Co za bałagan, który zrobiłem :-)
Luis Mendo,
4

APL (Dyalog Unicode) , 26 bajtów SBCS

Anonimowy przyrostek lambda traktujący n jako lewy argument, a M jako prawy argument.

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

Wypróbuj online!

{} Anonimowa lambda gdzie lewy argument i prawy argument:

⊢⍵ dają odpowiedni argument ( wydzielane ⍺ ⍺z )

⊢⌺⍺ ⍺ wszystkie -pod- podmacierze, w tym te nakładające się na krawędzie (te są wypełnione zerami)

()↓ Upuść następujące elementy liczbowe wzdłuż pierwszych dwóch wymiarów:

  ⍺÷2 połowa

  ¯1+ jeden negatywny plus to

   podsumowanie

  2⍴ cyklicznie r eshape do listy dwóch elementów

  s← Przechowywać w s(na s Hards)

  - negować (tj. upuścić z tyłu)

s↓upuść selementy wzdłuż pierwszego i drugiego wymiaru (od przodu)

Adám
źródło
4

APL (Dyalog Unicode) , 31 bajtów

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

Wypróbuj online!

Inne podejście niż Adám.

Erik the Outgolfer
źródło
Czy chcesz wyjaśnić (oczywiście po zakończeniu gry w golfa)? Byłbym zainteresowany, aby zobaczyć, jak to działa (i wcale nie znam APL) :)
Emigna
@Emigna Tak, jeśli będę miał czas do tego czasu.
Erik the Outgolfer
Bardzo mądry. Jeśli potrafisz z powodzeniem korzystać z dyadic w nie trywialnych przypadkach, to naprawdę opanowałeś programowanie tablic.
Adám
@ Adám Uh, chociaż myślę, że ta odpowiedź jest w rzeczywistości nieprawidłowa :-( EDYCJA: Naprawiona, ale teraz ma 31 bajtów ...
Erik Outgolfer
Skopiuj pakiet testowy z mojego zgłoszenia.
Adám
3

R , 75 bajtów

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

Wypróbuj online!

Trwa M, Ni Size matrycy.

Drukuje wynikowe macierze na standardowe wyjście; drop=Fjest potrzebne, więc w N=1przypadku, gdy indeksowanie nie upuszcza dimatrybutu i zwraca wartość matrixzamiast a vector.

Giuseppe
źródło
3

J , 11 8 bajtów

-3 bajty dzięki milom

<;._3~,~

Wypróbuj online!

Galen Iwanow
źródło
1
Wykorzystuje to 8 bajtów <;._3~,~i zamiast tego używa haka, aby sparować rozmiar z samym sobą, a następnie wycina i obciąża każdy, ponieważ matryca macierzy jest dozwolona jako wynik.
mile
@miles Dzięki, teraz jest elegancko!
Galen Iwanow
2

Galaretka , 5 bajtów

Z⁹Ƥ⁺€

Wykorzystuje format wyjściowy 4D. W przypadku 3D, dodaj a dla 6 bajtów .

Wypróbuj online!

Jak to działa

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
źródło
Na czacie zasugerowałem coś podobnego do user202729. Alternatywnym 5-bajtowym jest ṡ€Zṡ€.
Pan Xcoder,
2

Brachylog , 13 bajtów

{tN&s₎\;Ns₎}ᶠ

Wypróbuj online!

Zwraca listy kolumn.

Technicznie rzecz biorąc, tN&s₎\;Ns₎jest to predykat generujący, który ujednolica swój wynik z dowolnym z tych podmateriałów. Używamy {…}ᶠtylko do ujawnienia wszystkich możliwości.

Wyjaśnienie

 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
Fatalizować
źródło
1

Stax , 10 bajtów

│Æ☼♂Mqß E╖

Uruchom

Reprezentacja ascii tego samego programu to

YBFMyBF|PMmJ

Działa to w ten sposób.

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
rekurencyjny
źródło
1

JavaScript (ES6), 91 bajtów

Pobiera dane wejściowe w składni curry (a)(n). Zwraca wyniki jako listy wierszy.

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)

Przypadki testowe

Arnauld
źródło
1

APL (Dyalog Classic) , 24 23 bajty

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

Wypróbuj online!

wynikiem jest macierz macierzy, chociaż formatowanie wyjściowe Dyalogu nie czyni tego bardzo oczywistym

wprowadź macierz ( ), zamień każdy element w zagnieżdżoną macierz własnej ( ⍪¨), weź prefiks konkatenacje według row ( ,\) i kolumn (⍪⍀ ), wpisz n ( ), upuść pierwsze n-1 wiersze i kolumny zagnieżdżonych macierzy ( (¯1-t←-2⍴⎕)↓), weź prawy dolny róg n-po-n z każdej matrycy ( 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
źródło
0

Rubin , 63 bajty

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

Wypróbuj online!

Jest to lambda przyjmująca tablicę 2D i liczbę całkowitą, zwracająca tablicę 3D.

Nie golfowany:

->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
źródło
0

Python 2 , 91 bajtów

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

Wypróbuj online!

Chas Brown
źródło
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]oszczędza pięć.
Jonathan Allan