#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)])
: Объединить обе суммы (по строкам и столбцам) в один массив numpynp.unique(x)
: Найти количество уникальных элементов в массиве numpy xlen(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