Genera tutte le sotto-matrici quadrate di una determinata dimensione


14

Vi sarà data una matrice quadrata di interi M e un altro intero positivo n , rigorosamente piccole rispetto alla dimensione del M . Il tuo compito è quello di generare tutte le sotto-matrici quadrate di M di dimensione n .

Ai fini di questa sfida, una sub-matrice quadrata è un gruppo di adiacenti righe e colonne contenute in M .

Formati di input / output

Sei libero di scegliere qualsiasi altro formato ragionevole, questi sono solo alcuni esempi.

Ingresso

  • Una matrice nel tipo di matrice nativa (se la tua lingua ne ha una)
  • Un array 2D (un array di array 1D, ciascuno corrispondente a una riga / una colonna)
  • Un array 1D (poiché la matrice è sempre quadrata)
  • Una stringa (hai scelto la spaziatura, ma per favore non abusarne in alcun modo), ecc.

Produzione

  • Una matrice di matrici.
  • Un array 4D, in cui ciascun elemento (elenco 3D) rappresenta le sotto-matrici su una riga / colonna.
  • Un array 3D, in cui ciascun elemento (elenco 2D) rappresenta una sott matrice.
  • Una rappresentazione in forma di stringa delle sotto-matrici risultanti, ecc.

Specifiche

  • Puoi anche scegliere di prendere la dimensione di M come input. È garantito che sia almeno 2 .
  • L'orientamento dell'output è arbitrario: è possibile scegliere di generare le sotto-matrici come elenchi di colonne o elenchi di righe, ma la scelta deve essere coerente.
  • Puoi competere in qualsiasi linguaggio di programmazione e puoi prendere input e fornire output attraverso qualsiasi metodo standard , tenendo presente che queste scappatoie sono vietate per impostazione predefinita.
  • Questo è , quindi vince l'invio più breve (in byte) per ogni lingua .

Esempio

Dato n = 3 e M :

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

Le possibili matrici 3x3 sono:

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

Quindi il risultato sarebbe:

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

Come notato sopra, un output di:

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

sarebbe anche accettabile, se si sceglie di restituire le sotto-matrici come elenchi di righe.

Casi test

Gli ingressi 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

E gli output corrispondenti (sotto-matrici fornite come elenchi di righe):

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

Oppure, come elenchi di colonne:

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

Post sandbox (ora eliminato, solo gli utenti con reputazione oltre 2k possono visualizzarlo). Grazie a tutti coloro che hanno dato un feedback.
Mr. Xcoder,

Quindi è consentito questo formato di output ?
Luis Mendo,

@LuisMendo Sì, è permesso.
Mr. Xcoder,

Risposte:


6

05AB1E , 8 byte

2FεŒsù}ø

Provalo online!

Spiegazione

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 byte

thYC

Gli input sono n, quindi M.

L'output è una matrice, in cui ogni colonna contiene tutte le colonne di una matrice secondaria.

Provalo online!

Spiegazione

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

Più seriamente, tprende in modo implicito l' input n e lo duplica nello stack. hconcatena entrambe le copie di n , producendo l'array [n, n] . YCprende implicitamente l' input M , estrae tutti i suoi blocchi di dimensioni [n, n] e li dispone come colonne in ordine di colonna maggiore. Ciò significa che le colonne di ciascun blocco sono impilate verticalmente per formare una singola colonna.


1
LOL +1 per "pronome formale, leggermente vecchio stile", e un golf molto bello.
Giuseppe,

@Giuseppe Ho appena capito che è un determinante, non un pronome: - /
Luis Mendo,

Bene, ho sempre imparato il "tuo / tuo" come pronomi possessivi; questa è la prima volta che sento un determinante!
Giuseppe,

@Giuseppe "Il tuo / il tuo" sono determinanti possessivi, cioè vanno con un nome: "Questa è la tua macchina". "Tuo / tuo" sono pronomi possessivi, cioè il nome è omesso: "Questo è tuo". E inizialmente ho confuso "tuo" con un pronome personale, che in realtà sarebbe "tu". Che casino che ho fatto :-)
Luis Mendo,

4

APL (Dyalog Unicode) , 26 byte SBCS

Anonimo infissa lambda prendendo n come argomento di sinistra e M come argomento di destra.

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

Provalo online!

{... } lambda anonimo dove si trova l'argomento sinistro ed è l'argomento giusto:

⊢⍵ fornire l'argomento giusto ( separa ⍺ ⍺da )

⊢⌺⍺ ⍺ tutti -by- sottomatrici comprese quelle sovrapponendo i bordi (quelli vengono posti a zero)

()↓ Rilascia i seguenti elementi numerici lungo le prime due dimensioni:

  ⍺÷2 metà di

  ¯1+ uno negativo più quello

   arrotondare

  2⍴ ciclicamente r eshape ad una lista di due elementi

  s← conservare in s(per s hards)

  - negare (cioè cadere dalla parte posteriore)

s↓rilasciare selementi lungo la prima e la seconda dimensione (dalla parte anteriore)


4

APL (Dyalog Unicode) , 31 byte

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

Provalo online!

Un approccio diverso da quello di Adám.


Vuoi fornire una spiegazione (dopo aver finito il golf ovviamente)? Sarei interessato a vedere come funziona (e non conosco affatto APL) :)
Emigna,

@Emigna Sì, se avrò tempo per allora.
Erik the Outgolfer,

Molto intelligente. Se riesci a usare dyadic con successo per casi non banali, allora hai veramente imparato la programmazione dell'array.
Adám,

@ Adám Uh, anche se penso che questa risposta sia in realtà non valida :-( EDIT: risolto, ma ora è lungo 31 byte ...
Erik the Outgolfer

Sentiti libero di copiare la suite di test dalla mia richiesta.
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])

Provalo online!

Prende M, Ne l' Size della matrice.

Stampa le matrici risultanti su stdout; drop=Fè necessario quindi nel N=1caso in cui l'indicizzazione non elimini l' dimattributo e produca un matrixanziché un vector.


3

J , 11 8 byte

-3 byte grazie alle miglia

<;._3~,~

Provalo online!


1
Questo utilizza 8 byte <;._3~,~e utilizza invece un hook per accoppiare la dimensione con se stesso, quindi taglia e incassa ciascuno poiché una matrice di matrici è consentita come output.
miglia

@miles Grazie, ora è elegante!
Galen Ivanov,


2

Gelatina , 5 byte

Z⁹Ƥ⁺€

Utilizza il formato di output 4D. Per il 3D, aggiungi a per 6 byte .

Provalo online!

Come funziona

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.

Ho suggerito qualcosa di simile a user202729 in chat. Un alternativa a 5 byter è ṡ€Zṡ€.
Mr. Xcoder,

2

Brachylog , 13 byte

{tN&s₎\;Ns₎}ᶠ

Provalo online!

Ciò restituisce elenchi di colonne.

Tecnicamente, tN&s₎\;Ns₎è un predicato generatore che unifica il suo output con una di quelle sottomaterie. Usiamo {…}ᶠsolo per esporre tutte le possibilità.

Spiegazione

 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 byte

│Æ☼♂Mqß E╖

Eseguirlo

La rappresentazione ASCII dello stesso programma è

YBFMyBF|PMmJ

Funziona così.

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 byte

Accetta input nella sintassi del curry (a)(n). Restituisce i risultati come elenchi di righe.

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)

Casi test


1

APL (Dyalog Classic) , 24 23 byte

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

Provalo online!

il risultato è una matrice di matrici, anche se la formattazione dell'output di Dyalog non lo rende molto ovvio

inserisci la matrice ( ), trasforma ogni elemento in una matrice nidificata propria ( ⍪¨), prendi le concatenazioni del prefisso per riga ( ,\) e per colonna ( ⍪⍀), inserisci n ( ), rilascia le prime n-1 righe e colonne di matrici nidificate ( (¯1-t←-2⍴⎕)↓), prendi l'angolo n-per-n in basso a destra da ciascuna matrice ( 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      ┴──┴───┘        ┴──┴───┘
                                        └─┴──┴───┘

0

Rubino , 63 byte

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

Provalo online!

Questo è un lambda che prende un array 2D e un int, restituendo un array 3D.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.