이것이 Weyr 행렬입니까?


18

기본 Weyr 표준 형식 이라고하는 n × n 행렬 W 의 유형이 있습니다 . 이러한 행렬은 블록 으로 설명되며 다음 참조 다이어그램을 사용하여 다음과 같은 속성을 갖습니다.

여기에 이미지 설명을 입력하십시오

  • 주 대각선 블록 W II에 있는 N × N λ 형태의 행렬 I N 여기서 I N I를 는 IS N I × N I 행렬.
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • 제 superdiagonal 블록 W K-1, K2..r ∈ K 하다 N K-1 × N K 이다 행렬 의 행 - 감소 제대 형태의 전체 열 랭크 또는 더 간단히 말해서, I N k는 위에 앉아 n k-1 -n k 행의 0입니다.
  • 다른 모든 블록은 0 행렬입니다.

예를 들면 다음과 같습니다.

위어 양식

  • (황색) 주 대각선 블록은 N되도록되어 나는 4, 2, 2, 1이다.
  • 첫 번째 초대 각 블록은 녹색입니다.
  • 회색 영역은 다른 모든 블록으로 구성되며 모두 0 입니다.

이 과제에서는 λ = 1로 가정합니다.

입력

편리한 형식의 0과 1을 갖는 정사각 행렬.

산출

입력 행렬이 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]]

비위 어 :

[[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
weyr, matrix에 대한 당신의 정의는 매우 불분명합니다. 그것을 이해하기 위해서는 먼저 위키피디아에서 정의를 읽어야했습니다. 우선 n <sub> i </ sub> 가 무엇이며 무엇을 의미하는지 명확하게 밝힐 것입니다. 현재 이러한 n 이 존재 하면 행렬이 위급하다는 것이 명확하지 않으며 오히려 일부가 행렬의 속성.
밀 마법사

항등 행렬이 Weyr- 행렬이라는 것이 맞습니까?
Stewie Griffin

항등 행렬은 r = 1이고 n_1 = n 인 Weyr 행렬이므로 그렇습니다.
S.Klumpers

2
권장 테스트 사례 : [[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]]. 나는 그것이 거짓이라고 생각합니다 (그러나 내 대답은 그것을 그렇게 식별하지 못합니다).
Arnauld

포함 된 정의는 일반적인 weyr 행렬이 아니라 기본 weyr 행렬 만 식별하고 싶다고 제안합니다. 이것이 당신이이 도전에 대한 의도입니까?
S.Klumpers

답변:



1

파이썬 2 , 270 바이트

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

온라인으로 사용해보십시오!

설명:

블록의 동일성 및 초대 각 블록을 재귀 적으로 검사합니다.

I 행렬이 항등 행렬인지 확인

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

입력 행렬의 각 블록에 대해 함수는 그것이 신원인지, 또 다른 신원 행렬 블록이 있는지 확인합니다. 다음 반복에서는 해당 크기의 블록을 살펴 봅니다.

{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
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.