Esta é uma matriz de Weyr?

18

Há um tipo de n x n matriz W chamada básica forma canónica Weyr . Essa matriz é descrita por seus blocos e possui as seguintes propriedades, usando o seguinte diagrama de referência:

insira a descrição da imagem aqui

  • os principais blocos diagonais W II são n i x n i matrizes da forma λ I n i em que I n i é a n i x n i matriz identidade.
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • os primeiros blocos superdiagonal W k k-1, para k ∈ 2..r são n k-1 × n k matrizes que são posto coluna cheia em forma escalonada de redução de linha , ou mais simplesmente, que n k senta-se sobre n k-1 - n k linhas de zeros.
  • todos os outros blocos são 0 matrizes.

Por exemplo:

Forma Weyr

  • Os principais blocos diagonais (amarelo) são tais que o n i são 4, 2, 2, e 1.
  • Os primeiros blocos superdiagonais estão em verde.
  • A zona cinza consiste em todos os outros blocos, que são todos 0 .

Para este desafio, assumiremos λ = 1.

Entrada

Uma matriz quadrada com 0s e 1s em qualquer formato conveniente.

Resultado

Envie um dos dois valores distintos para saber se a matriz de entrada é Weyr ou não Weyr.

Regras

Isso é . O menor número de bytes em cada idioma vence. Regras / lacunas padrão se aplicam.

Casos de teste

Apresentado como matrizes de linhas.

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

Não-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]]
ngm
fonte
2
Sua definição de weyr, matrix não é clara. Para entender, eu precisava primeiro ler a definição da wikipedia (o que também não é muito claro) e mesmo assim sua definição é vaga e ambígua. Por um lado, eu deixaria mais claro o que n <sub> i </sub> é e o que deve ser feito atualmente. Atualmente, não está muito claro que uma matriz seja muito pesada se esses n existirem e parece que são alguns propriedade da matriz.
Assistente de trigo
É correto que a matriz de identidade seja uma matriz de Weyr?
Stewie Griffin
A matriz de identidade é uma matriz de Weyr com r = 1 en_1 = n, portanto, sim, embora seja uma degenerada.
S.Klumpers
2
Caso de teste sugerido: [[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]]. Eu acho que é falso (mas minha resposta falha em identificá-lo como tal).
Arnauld 30/05
As definições incluídas sugerem que você deseja apenas identificar matrizes básicas deyr e não matrizes gerais. É isso que você pretendia para esse desafio?
S.Klumpers

Respostas:

1

Python 2 , 270 bytes

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

Experimente online!

Explicação:

Verifica recursivamente os blocos quanto à identidade e seus blocos superdiagonais.

I verifica se uma matriz é uma matriz de identidade

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

Para cada bloco da matriz de entrada, a função verifica se é uma identidade e se há outro bloco da matriz de identidade, à direita. A próxima iteração, em seguida, analisa um bloco desse tamanho.

{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
)
TFeld
fonte