È una matrice di Weyr?


18

C'è un tipo di matrice n × n W chiamata forma canonica di Weyr di base . Tale matrice è descritta dai suoi blocchi e ha le seguenti proprietà, usando il seguente diagramma di riferimento:

inserisci qui la descrizione dell'immagine

  • i principali blocchi diagonali W ii sono n i × n i matrici della forma λ I n i dove I n i è la matrice di identità n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • i primi blocchi superdiagonali W k-1, k per k ∈ 2..r sono n k-1 × n k matrici che sono rango di colonna completo in forma di scaglione ridotto di riga , o più semplicemente, I n k seduti sopra n k-1 : n k righe di zeri.
  • tutti gli altri blocchi sono 0 matrici.

Per esempio:

Forma di Weyr

  • I blocchi diagonali principali (gialli) sono tali che n i sono 4, 2, 2 e 1.
  • I primi blocchi superdiagonali sono in verde.
  • La zona grigia è composta da tutti gli altri blocchi, che sono tutti 0 .

Per questa sfida assumeremo λ = 1.

Ingresso

Una matrice quadrata con 0 e 1 in qualsiasi formato conveniente.

Produzione

Stampa uno dei due valori distinti per stabilire se la matrice di input è Weyr o no Weyr.

Regole

Questo è . Vince il minor numero di byte in ogni lingua. Si applicano le regole / scappatoie standard.

Casi test

Presentato come array di righe.

Weyr:

[[1]] 
[[1,1],[0,1]] 
[[1,0,1,0,0],[0,1,0,1,0],[0,0,1,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,1,0,0],[0,0,0,0,1,0,0,1,0],[0,0,0,0,0,1,0,0,1],[0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]
[[1,0,0,0,1,0,0,0,0],[0,1,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]

Non-Weyr:

[[0]]
[[1,0],[1,1]]
[[1,0,0,1,0,0],[0,1,0,0,0,0],[0,0,1,0,0,1],[0,0,0,1,0,0],[0,0,0,0,1,0],[0,0,0,0,0,1]]
[[1,0,1,0,0],[0,1,0,0,0],[0,0,1,0,0],[0,0,0,1,0],[0,0,0,0,1]]
[[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]

2
La tua definizione di weyr, matrice è molto chiara. Per capirlo ho dovuto prima leggere la definizione da Wikipedia (che non è neanche molto chiara) e anche allora la tua definizione è piuttosto vaga e ambigua. Per uno vorrei chiarire cosa sia n <sub> i </sub> e cosa significhi fare, attualmente non è molto chiaro che una matrice sia weyr se tali n esistono e piuttosto sembra che siano alcune proprietà della matrice.
Mago del grano,

È corretto che la matrice identità sia una matrice Weyr?
Stewie Griffin,

La matrice identità è una matrice Weyr con r = 1 e n_1 = n, quindi sì, anche se degenerata.
S.Klumpers,

2
Banco di prova consigliato: [[1,0,0,1,0,0,0,0,0],[0,1,0,0,1,0,0,0,0],[0,0,1,0,0,1,0,0,0],[0,0,0,1,0,0,0,0,0],[0,0,0,0,1,0,1,0,0],[0,0,0,0,0,1,0,1,0],[0,0,0,0,0,0,1,0,1],[0,0,0,0,0,0,0,1,0],[0,0,0,0,0,0,0,0,1]]. Penso che sia falso (ma la mia risposta non riesce a identificarlo come tale).
Arnauld,

Le definizioni incluse suggeriscono che si desidera identificare solo le matrici weyr di base e non le matrici weyr generali. È questo ciò che intendevi per questa sfida?
S.Klumpers,

Risposte:



1

Python 2 , 270 byte

lambda m,w=0:{w}&{0,len(m)}and I(m)or any(I([l[:i]for l in m[:i]])*I([l[i:j+i]for l in m[:j]])*(sum(sum(m[:i]+[l[:i]for l in m],[]))==2*i+j)and f([l[i:]for l in m[i:]],j)for i in range(w,len(m))for j in range(1,i+1))
I=lambda m:all(sum(l)==l[i]>0for i,l in enumerate(m))

Provalo online!

Spiegazione:

Controlla ricorsivamente i blocchi per l'identità e i loro blocchi superdiagonali.

I controlla se una matrice è una matrice di identità

I=lambda m:all(sum(l)==l[i]>0for i,l in enumerate(m))

Per ogni blocco della matrice di input, la funzione verifica che sia un'identità e che esista un altro blocco della matrice di identità, alla sua destra. La successiva iterazione quindi esamina un blocco di quelle dimensioni.

{w}&{0,len(m)}and I(m)                # if the while matrix is an identity matrix,
                                      # return true (but only the first time or last block)
or
any(
 I([l[:i]for l in m[:i]])                         # the current block is identity
 *I([l[i:j+i]for l in m[:j]])                     # and, the smaller block to the right is identity
 *(sum(sum(m[:i]+[l[:i]for l in m],[]))==2*i+j)   # and everything below and to the right (not the
                                                  # smaller block), are 0
 and f([l[i:]for l in m[i:]],j)                   # and the remaining matrix is alse Weyr(recursively)
 for i in range(w,len(m))             # for each block size i
 for j in range(1,i+1)                # for each smaller right block of size j
)
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.