Đây có phải là ma trận Weyr không?


18

Có một loại n × n ma trận W được gọi là cơ bản hình thức kinh điển Weyr . Một ma trận như vậy được mô tả bởi các khối của nó và có các thuộc tính sau, sử dụng sơ đồ tham chiếu sau:

nhập mô tả hình ảnh ở đây

  • các khối đường chéo chính W ii là ma trận n i × n i có dạng λ I n i trong đó I n i là ma trận danh tính n i × n i .
  • n 1 ≥ n 2 ≥ ... n r
  • các khối superdiagonal đầu tiên W k-1, k cho k ∈ 2..rn k-1 × n k ma trận có cấp bậc cột đầy đủ theo hình thức bậc thang hàng-giảm , hoặc đơn giản hơn đặt, tôi n k ngồi trên đỉnh n k - 1 - n k hàng số không.
  • tất cả các khối khác là 0 ma trận.

Ví dụ:

Hình thức Weyr

  • Các khối đường chéo chính (màu vàng) sao cho n i là 4, 2, 2 và 1.
  • Các khối siêu chéo đầu tiên có màu xanh lá cây.
  • Vùng màu xám bao gồm tất cả các khối khác, tất cả đều bằng 0 .

Đối với thử thách này, chúng tôi sẽ giả sử = 1.

Đầu vào

Một ma trận vuông có 0 và 1 ở bất kỳ định dạng thuận tiện nào.

Đầu ra

Xuất một trong hai giá trị riêng biệt cho dù ma trận đầu vào là Weyr hay không Weyr.

Quy tắc

Đây là . Ít byte nhất trong mỗi ngôn ngữ sẽ thắng. Quy tắc chuẩn / sơ hở áp dụng.

Các trường hợp thử nghiệm

Trình bày dưới dạng mảng của các hàng.

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

Không phải 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
Định nghĩa của bạn về weyr, ma trận là rất không rõ ràng. Để hiểu nó, trước tiên tôi cần đọc định nghĩa từ wikipedia (cũng không rõ lắm) và thậm chí sau đó định nghĩa của bạn khá mơ hồ và mơ hồ. Đối với một tôi sẽ làm cho nó rõ ràng hơn những gì n <sub> i </ sub> là gì và nó là trung bình để làm, hiện nay nó không phải là rất rõ ràng rằng một ma trận là weyr nếu như n s tồn tại và thay nó có vẻ như họ là một số tính chất của ma trận.
Phù thủy lúa mì

Có đúng là ma trận danh tính là ma trận Weyr không?
Stewie Griffin

Ma trận danh tính là ma trận Weyr với r = 1 và n_1 = n, vì vậy, mặc dù là một suy biến.
S.Klumpers

2
Trường hợp thử nghiệm đề xuất : [[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]]. Tôi nghĩ đó là giả dối (nhưng câu trả lời của tôi không xác định nó là như vậy).
Arnauld

Các định nghĩa bạn đưa vào đề nghị bạn chỉ muốn xác định ma trận weyr cơ bản, chứ không phải ma trận weyr chung. Đây có phải là những gì bạn dự định cho thử thách này?
S.Klumpers

Câu trả lời:



1

Python 2 , 270 byte

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

Hãy thử trực tuyến!

Giải trình:

Kiểm tra đệ quy các khối để nhận dạng và các khối siêu chéo của chúng.

I kiểm tra nếu một ma trận là một ma trận danh tính

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

Đối với mỗi khối của ma trận đầu vào, hàm sẽ kiểm tra xem đó có phải là một danh tính không, và có một khối ma trận nhận dạng khác, đúng không. Lặp lại tiếp theo sau đó nhìn vào một khối có kích thước đó.

{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
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.