Проверка на наличие Magic Square Python

#python

#python

Вопрос:

я пытаюсь создать функцию, которая проверяет, является ли матрица магическим квадратом. мне нужно только проверить вертикальную и горизонтальную (не диагональную). иногда это проходит, а иногда терпит неудачу. я надеялся, что кто-нибудь поможет мне решить проблему. это мой код:

 for i in range(len(m)):
     if len(m[i]) != len(m):
          return False
return True
  

и это тот, который терпит неудачу. он возвращает false:

 
m = [ [1,2,3,4]
    , [5,6,7,8]
    , [9,10,11,12]
    , [13,14,15,16]
    ]
print(magic_square(m)) == False)
  

Комментарии:

1. Вы имеете в виду, что сумма всех строк и столбцов должна быть одинаковой, чтобы ее можно было квалифицировать как магический квадрат?

2. да! это только те строки и цвета, которые должны совпадать

Ответ №1:

Предоставленный вами код не проверяет, является ли матрица магическим квадратом, он проверяет только, является ли матрица (в данном случае список списков) квадратной. После этой проверки вам нужно вычислить суммы каждой строки, каждого столбца и каждой диагонали (хотя по какой-то причине вы сказали, что они вам не нужны) и сравнить, все ли они равны.

Ответ №2:

Если вы согласны с использованием numpy, вы можете использовать

 m = np.array(m)
len(np.unique(np.concatenate([m.sum(axis=1), m.sum(axis=0)]))) == 1
  

Тестовые примеры:

 m = [ [1,2,3,4]
    , [5,6,7,8]
    , [9,10,11,12]
    , [13,14,15,16]
    ]
m = np.array(m)
print (len(np.unique(np.concatenate([m.sum(axis=1), m.sum(axis=0)]))) == 1)


m = [ [2,7,6]
    , [9,5,1]
    , [4,3,8]    
    ]
m = np.array(m)
print (len(np.unique(np.concatenate([m.sum(axis=1), m.sum(axis=0)]))) == 1)
  

Вывод:

 False
True
  

Значение:

  • m.sum(axis=1) : Суммируйте массив numpy по строкам
  • m.sum(axis=0) : Суммируйте массив numpy по столбцам
  • np.concatenate([m.sum(axis=1), m.sum(axis=0)]) : Объединить обе суммы (по строкам и столбцам) в один массив numpy
  • np.unique(x) : Найти количество уникальных элементов в массиве numpy x
  • len(np.unique(np.concatenate([m.sum(axis=1), m.sum(axis=0)]))) == 1) : Проверьте, что количество уникальных элементов в сумме по строкам и столбцам равно 1. т.е. Все суммы по строкам и столбцам одинаковы.

Ответ №3:

Это не так умно, как ответ numpy, но это работает

 def magic_square(m):
    # check size
    for i in range(len(m)):
       if len(m[i]) != len(m):
          return False
          
    # check row sums
    for r in m:
       if sum(r) != sum(m[0]):
          return False
    
    # check column sums
    cols = [[r[c] for r in m] for c in range(len(m[0]))]
    for c in cols:
       if sum(c) != sum(m[0]):
          return False
       
    return True


m = [ [1,2,3,4]
    , [5,6,7,8]
    , [9,10,11,12]
    , [13,14,15,16]
    ]
print(magic_square(m))  # False
 
m = [ [8,11,14,1]
    , [13,2,7,12]
    , [3,16,9,6]
    , [10,5,4,15]
    ]
print(magic_square(m))  # True