¿Es esta una matriz de Weyr?


18

Hay un tipo de n × n matriz W llamada forma canónica básica de Weyr . Dicha matriz se describe por sus bloques y tiene las siguientes propiedades, utilizando el siguiente diagrama de referencia:

ingrese la descripción de la imagen aquí

  • los bloques diagonales principales W ii son n i × n i matrices de la forma λ I n i donde I n i es la matriz de identidad n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • los primeros bloques superdiagonales W k-1, k para k ∈ 2..r son n k-1 × n k matrices que son rango de columna completo en forma escalonada reducida , o más simplemente, I n k sentado encima de n k-1 - n k filas de ceros.
  • todos los otros bloques son 0 matrices.

Por ejemplo:

Forma de Weyr

  • Los bloques diagonales principales (amarillo) son tales que n i son 4, 2, 2 y 1.
  • Los primeros bloques superdiagonales están en verde.
  • La zona gris consta de todos los otros bloques, que son todos 0 .

Para este desafío asumiremos λ = 1.

Entrada

Una matriz cuadrada con 0s y 1s en cualquier formato conveniente.

Salida

Genere uno de dos valores distintos para saber si la matriz de entrada es Weyr o no Weyr.

Reglas

Este es el . Pocos bytes en cada idioma gana. Se aplican reglas estándar / lagunas.

Casos de prueba

Presentado como matrices de filas.

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

No 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
Su definición de weyr, matriz es muy poco clara. Para entenderlo, primero necesitaba leer la definición de Wikipedia (que tampoco está muy clara) e incluso entonces su definición es bastante vaga y ambigua. Por un lado, aclararía qué es n <sub> i </sub> y qué significa hacer, actualmente no está muy claro que una matriz sea extraña si tales n existen y más bien parece que son algunas propiedad de la matriz.
— Wheat Wizard

¿Es correcto que la matriz de identidad sea una matriz Weyr?
— Stewie Griffin

La matriz de identidad es una matriz de Weyr con r = 1 y n_1 = n, así que sí, aunque degenerada.
— S.Klumpers

2
Caso de prueba sugerida: [[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]]. Creo que es falso (pero mi respuesta no lo identifica como tal).
— Arnauld

Las definiciones que incluyó sugieren que solo desea identificar las matrices weyr básicas y no las matrices weyr generales. ¿Es esto lo que pretendías para este desafío?
— S.Klumpers

Respuestas:



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

Pruébalo en línea!

Explicación:

Verifica recursivamente los bloques en busca de identidad y sus bloques superdiagonales.

I comprueba si una matriz es una matriz de identidad

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

Para cada bloque de la matriz de entrada, la función comprueba que es una identidad y que hay otro bloque de matriz de identidad, a la derecha. La siguiente iteración luego mira un bloque de ese tamaño.

{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
)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.