这是一个韦尔矩阵吗?


18

有一种n × n矩阵W,称为基本Weyr规范形式。使用以下参考图,此类矩阵由其描述,并具有以下属性:

在此处输入图片说明

  • 主对角线块W¯¯ IIÑ ×n个矩阵形式的λ Ñ 其中Ñ Ñ ×n的单位矩阵。
  • Ñ 1 ≥Ñ 2 ≥...≥Ñ ř
  • 第一superdiagonal块w ^ K-1,Kķ∈2..rÑ K-1 ×n个ķ矩阵是行还原梯形形式列满秩,或更简单地说,Ñ ķ坐在的顶部n k-1 -n k行零。
  • 所有其他块均为0矩阵。

例如:

韦尔形式

  • 主对角线块(黄色)使得n i为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
您对韦尔矩阵的定义还不清楚。为了理解它,我需要首先阅读维基百科的定义(这也不是很清楚),即使那样,您的定义也仍然很模糊和模棱两可。首先,我要弄清楚n <sub> i </ sub>是什么,意味着要做什么,目前还不清楚如果存在n,那么矩阵是否很奇怪,而似乎它们是某个矩阵的属性。
小麦巫师

单位矩阵是Weyr矩阵是否正确?
Stewie Griffin

单位矩阵是r = 1且n_1 = n的Weyr矩阵,所以是的,尽管是简并的。
S.Klumpers '18

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]]。我认为这是虚假的(但我的回答未能如此识别)。
阿诺尔德

您包含的定义建议您只想识别基本的weyr矩阵,而不是一般的weyr矩阵。这是您要应对此挑战的目的吗?
S.Klumpers '18

Answers:



1

Python 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
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.