Це матриця Вейра?


18

Існує тип матриці n × n W, що називається базовою канонічною формою Вейра . Така матриця описується її блоками і має такі властивості, використовуючи наступну еталонну діаграму:

введіть тут опис зображення

  • основними діагональними блоками W ii є n i × n i матриці вигляду λ I n i, де I n i - матриця тотожності n i × n i .
  • n 1 ≥ n 2 ≥ ... ≥ n r
  • перші наддіагональні блоки W k-1, k для k ∈ 2..r - це n k-1 × n k матриць, які є повним рангом стовпця в ешелонній формі , зменшеній рядками , або, простіше кажучи, я n k, сидячи зверху n k-1 - n k рядів нулів.
  • всі інші блоки - 0 матриць.

Наприклад:

Форма Вейра

  • Основні діагональні блоки (жовті) такі, що n i - 4, 2, 2 та 1.
  • Перші наддіагональні блоки зеленого кольору.
  • Сіра зона складається з усіх інших блоків, всі 0 .

Для цього виклику будемо вважати λ = 1.

Вхідні дані

Квадратна матриця з 0 і 1 в будь-якому зручному форматі.

Вихід

Виведіть одне з двох різних значень для того, чи є вхідна матриця Вейра чи ні Вейра.

Правила

Це . Виграє найменше байтів у кожній мові. Застосовуються стандартні правила / лазівки.

Тестові справи

Представлено у вигляді масивів рядків.

Вейр:

[[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 дуже незрозуміле. Щоб зрозуміти це, мені потрібно було спочатку прочитати визначення з wikipedia (що теж не дуже зрозуміло), і навіть тоді ваше визначення досить розпливчасте і неоднозначне. Для одного я б зрозумів, що таке n <sub> i </sub> і що це означає робити, на даний момент не дуже зрозуміло, що матриця є найвищою, якщо такі n s існують, і швидше здається, що вони є деякими властивість матриці.
Пост Рок Гарф Хантер

Чи правильно, що матриця ідентичності є матрицею Вейра?
Стюі Гріффін

Матриця ідентичності - це матриця Вейра з r = 1 і n_1 = n, тому так, хоч і вироджена.
С.Кламперс

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. Це те, що ви задумали для цього виклику?
С.Кламперс

Відповіді:



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
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.