Czy to macierz Weyra?

18

Istnieje rodzaj macierzy n × n W zwanej podstawową formą kanoniczną Weyru . Taka matryca jest opisana za pomocą bloków i ma następujące właściwości, przy użyciu następującego diagramu referencyjnego:

wprowadź opis zdjęcia tutaj

  • głównymi blokami diagonalnymi W ii są macierze n i × n i postaci λ I n i gdzie I n i jest macierzą tożsamości n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • pierwsze bloki superdiagonalne W k-1, k dla k ∈ 2..rmacierzami n k-1 × n k , które mają pełną rangę kolumny w postaci rzutu o zmniejszonej liczbie wierszy , lub prościej mówiąc, I n k siedzi na n k-1 - n k rzędów zer.
  • wszystkie pozostałe bloki mają 0 macierzy.

Na przykład:

Formularz Weyra

  • Główne ukośne bloki (żółte) są takie, że n i wynoszą 4, 2, 2 i 1.
  • Pierwsze superdiagonalne bloki są zielone.
  • Szara strefa składa się ze wszystkich pozostałych bloków, które mają wartość 0 .

Dla tego wyzwania przyjmiemy λ = 1.

Wejście

Matryca kwadratowa z zerami i zerami w dowolnym dogodnym formacie.

Wynik

Wyprowadza jedną z dwóch różnych wartości określających, czy macierzą wejściową jest Weyr, czy nie Weyr.

Zasady

To jest . Wygrywa najmniej bajtów w każdym języku. Obowiązują standardowe zasady / luki.

Przypadki testowe

Przedstawione jako tablice wierszy.

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]]
ngm
źródło
2
Twoja definicja Weyru, macierzy jest bardzo niejasna. Aby to zrozumieć, musiałem najpierw przeczytać definicję z wikipedii (która również nie jest bardzo jasna), a nawet wtedy twoja definicja jest raczej niejasna i niejednoznaczna. Dla jednego chciałbym uczynić go bardziej zrozumiałym, co n <sub> i </ sub> jest i co to jest średni do zrobienia, obecnie nie jest bardzo jasne, że matryca jest Weyr Jeśli taki n s istnieje, a raczej wydaje się, że niektóre właściwość macierzy.
Kreator pszenicy
Czy to prawda, że ​​macierz tożsamości jest macierzą Weyra?
Stewie Griffin
Macierz tożsamości jest macierzą Weyra o r = 1 i n_1 = n, więc tak, choć zdegenerowaną.
S.Klumpers
2
Sugerowana przypadek testowy: [[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]]. Myślę, że to fałsz (ale moja odpowiedź nie identyfikuje go jako takiego).
Arnauld
Podane definicje sugerują, że chcesz jedynie identyfikować podstawowe macierze Weyru, a nie ogólne macierze Weyru. Czy to jest to, co zamierzałeś podjąć w tym wyzwaniu?
S.Klumpers

Odpowiedzi:

1

Python 2 , 270 bajtów

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

Wypróbuj online!

Wyjaśnienie:

Rekurencyjnie sprawdza bloki pod kątem tożsamości i ich superdiagonalnych bloków.

I sprawdza, czy macierz jest matrycą tożsamości

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

Dla każdego bloku macierzy wejściowej funkcja sprawdza, czy jest to tożsamość i czy jest inny blok macierzy tożsamości, po prawej stronie. Następna iteracja sprawdza blok o tym rozmiarze.

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