Это матрица Вейра?


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 матриц, которые имеют полный ранг столбца в форме эшелона с уменьшенным числом строк , или, проще говоря, I 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]]

Non-Вейр:

[[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 существуют, и скорее кажется, что они свойство матрицы.
Пшеничный волшебник

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

Тождественная матрица - это матрица Вейра с 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]]. Я думаю, что это ложно (но мой ответ не может определить его как таковой).
Арно

Определения, которые вы включили, предполагают, что вы хотите идентифицировать только базовые матрицы Вейра, а не общие матрицы Вейра. Это то, что вы хотели для этого вызова?
С.Клюмперс

Ответы:



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.