Bu bir Weyr matrisi mi?


18

Bir türü vardır n x n matris G adı verilen temel Weyr kanonik formu . Böyle bir matris blokları ile tarif edilir ve aşağıdaki referans diyagramı kullanılarak aşağıdaki özelliklere sahiptir:

resim açıklamasını buraya girin

  • Ana diyagonal blok B ii olan n- ı x n i λ formun matrisler I n ı burada I , n i olduğu , n ı x n i birim matris.
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • İlk superdiagonal blok B , k-1, k için 2..r ∈ k olan n- k-1 × n k olan matrisler satır düşük kademe şeklinde tam kolon sıralaması veya daha basit söylemek gerekirse, I , n k üstüne oturan n k-1 - n k sıfır sırası.
  • diğer tüm bloklar 0 matristir.

Örneğin:

Weyr formu

  • Ana diyagonal bloklar (sarı) n i 4, 2, 2 ve 1 olacak şekildedir.
  • İlk süper eksenli bloklar yeşildir.
  • Gri bölge, tümü 0 olan diğer tüm bloklardan oluşur .

Bu meydan okuma için λ = 1 olduğunu varsayacağız.

Giriş

Herhangi bir uygun formatta 0s ve 1s olan bir kare matris.

Çıktı

Giriş matrisinin Weyr olup olmadığı için iki ayrı değerden birini çıktılayın.

kurallar

Bu . Her dilde en az bayt kazanır. Standart kurallar / boşluklar geçerlidir.

Test senaryoları

Satır dizileri olarak sunulur.

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

Sigara 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
Weyr, matrix tanımınız çok net değil. Bunu anlamak için önce wikipedia'dan (çok da açık olmayan) tanımı okumam gerekiyordu ve o zaman bile tanımınız oldukça belirsiz ve belirsiz. İlk olarak bunu daha net neyi yapacak n <sub> i </ sub> böyle olursa olduğunu ve ne yapmak demek olduğunu şu anda çok bir matris Weyr olduğunu belli değil n onlar bazıları gibi ler var olur ve daha çok görünüyor matrisin özelliği.
Post Rock Garf Hunter

Kimlik matrisinin Weyr-matrisi olması doğru mu?
Stewie Griffin

Kimlik matrisi, r = 1 ve n_1 = n olan bir Weyr matrisidir, bu yüzden evet, dejenere olsa da.
S.Klumpers

2
Önerilen test durumu: [[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]]. Sanırım bu sahte (ama cevabım bunu böyle tanımlayamıyor).
Arnauld

Eklediğiniz tanımlar, genel weyr matrislerini değil, yalnızca temel weyr matrislerini tanımlamak istediğinizi önerir. Bu meydan okuma için amaçladığınız şey bu mu?
S.Klumpers

Yanıtlar:



1

Python 2 , 270 bayt

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

Çevrimiçi deneyin!

Açıklama:

Blokları kimlik ve onların süper eksenli bloklarını tekrar tekrar kontrol eder.

I bir matrisin bir kimlik matrisi olup olmadığını kontrol eder

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

Giriş matrisinin her bloğu için işlev, bir kimlik olup olmadığını ve sağında başka bir kimlik matrisi bloğu olduğunu kontrol eder. Bir sonraki yineleme bu boyuttaki bir bloğa bakar.

{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
)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.