Apakah ini matriks Weyr?

18

Ada jenis n × n matriks W yang disebut bentuk kanonik Weyr dasar . Matriks seperti itu dijelaskan oleh blok - bloknya dan memiliki sifat-sifat berikut, menggunakan diagram referensi berikut:

masukkan deskripsi gambar di sini

  • blok diagonal utama W ii adalah n i × n i matriks dari bentuk λ I n i di mana I n i adalah matriks identitas n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • blok superdiagonalnya pertama W k-1, k untuk k ∈ 2..r adalah n k-1 × n k matriks yang penuh rank kolom dalam bentuk eselon baris tereduksi , atau lebih sederhananya, saya n k duduk di atas n k-1 - n k baris nol.
  • semua blok lainnya adalah 0 matriks.

Sebagai contoh:

Bentuk Weyr

  • Blok diagonal utama (kuning) sedemikian rupa sehingga n i adalah 4, 2, 2, dan 1.
  • Blok superdiagonal pertama berwarna hijau.
  • Zona abu-abu terdiri dari semua blok lainnya, yang semuanya 0 .

Untuk tantangan ini kita akan mengasumsikan λ = 1.

Memasukkan

Matriks persegi dengan 0s dan 1s dalam format apa pun yang nyaman.

Keluaran

Keluarkan salah satu dari dua nilai berbeda untuk apakah matriks input adalah Weyr atau tidak.

Aturan

Ini adalah . Bytes paling sedikit di setiap bahasa menang. Aturan / celah standar berlaku.

Uji kasus

Disajikan sebagai array baris.

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
sumber
2
Definisi Anda tentang weyr, matrix sangat tidak jelas. Untuk memahaminya saya harus terlebih dahulu membaca definisi dari wikipedia (yang juga tidak terlalu jelas) dan bahkan kemudian definisi Anda agak kabur dan ambigu. Untuk satu saya akan membuatnya lebih jelas apa n <sub> i </sub> itu dan apa yang harus dilakukan, saat ini tidak terlalu jelas bahwa sebuah matriks adalah weyr jika n tersebut ada dan sepertinya mereka adalah beberapa properti dari matriks.
Wheat Wizard
Apakah benar bahwa matriks identitas adalah matriks Weyr?
Stewie Griffin
Matriks identitas adalah matriks Weyr dengan r = 1 dan n_1 = n, jadi ya, meskipun degenerasi.
S.Klumpers
2
Kasus uji yang disarankan: [[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]]. Saya pikir itu salah (tapi jawaban saya gagal mengidentifikasinya).
Arnauld
Definisi yang Anda masukkan menyarankan Anda hanya ingin mengidentifikasi matriks dasar weir, dan bukan matriks umum weir. Apakah ini yang Anda maksudkan untuk tantangan ini?
S.Klumpers

Jawaban:

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

Cobalah online!

Penjelasan:

Secara rekursif memeriksa blok untuk identitas dan blok superdiagonal mereka.

I memeriksa apakah sebuah matriks adalah matriks identitas

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

Untuk setiap blok matriks input, fungsinya memeriksa apakah itu sebuah identitas, dan bahwa ada blok matriks identitas lain, di sebelah kanannya. Iterasi berikutnya kemudian melihat blok ukuran itu.

{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
sumber