Я написал программу на Python, чтобы определить, является ли матрица магическим квадратом или нет. Это работает, но я не могу избавиться от ощущения, что, возможно, слишком усложнил решение. Я видел другие реализации, которые были намного короче, но мне было интересно, насколько эффективен / неэффективен мой код и как я могу его улучшить и / или сократить, чтобы достичь желаемого результата.
def main():
matrix = [[4,9,2],
[3,5,7],
[8,1,6]]
result = loShu(matrix)
print(result)
def loShu(matrix):
i = 0
j = 0
for i in range(0, len(matrix)):
for j in range(0, len(matrix[j])):
if ((matrix[i][j] < 1) or (matrix[i][j] > 9)):
return ("This is not a Lo Shu Magic Square - one of the numbers is invalid")
row1 = matrix[0][0] + matrix[0][1] + matrix[0][2]
row2 = matrix[1][0] + matrix[1][1] + matrix[1][2]
row3 = matrix[2][0] + matrix[2][1] + matrix[2][2]
ver1 = matrix[0][0] + matrix[1][0] + matrix[2][0]
ver2 = matrix[0][1] + matrix[1][1] + matrix[2][1]
ver3 = matrix[0][2] + matrix[1][2] + matrix[2][2]
diag1 = matrix[0][0] + matrix[1][1] + matrix[2][2]
diag2 = matrix[0][2] + matrix[1][1] + matrix[2][0]
checkList = [row1,row2,row3,ver1,ver2,ver3,diag1,diag2]
temp = checkList[0]
for x in range (0, len(checkList)):
if checkList[x] != temp:
return ("This is not a Lo Shu Magic Square")
return ("This is a Lo Shu Magic Square")
main()
1 ответ
Ваше решение жестко запрограммировано для матриц размера 3×3 — почему бы также не поддерживать матрицы произвольного размера? Также сложно поддерживать и отлаживать ваш код, т. Е. Легко где-то напортачить, когда вы индексируете свои строки и столбцы. Кроме того, представьте, что вы хотите рассмотреть более крупные матрицы: какой кошмар сейчас измените существующую логику!
Более надежное решение может превратиться в тупой. В частности, вы можете проверить суммы строк и столбцов, выполнив m.sum()
а также m.sum(axis=1)
, и вычислить суммы диагоналей через m.trace()
или по sum(np.diag(m))
а также sum(np.diag(np.fliplr(m))
.
В качестве общего комментария просто верните логическое значение из вашей функции. Пусть основная программа решает, что делать с этим значением, т.е. печатать ли «это хорошо», «это магический квадрат Ло Шу» или что-то еще. Таким образом, ваша функция проверки остается чистой и более общей.
В этом есть смысл. Это именно то, что я искал — способ, отличный от жесткого кодирования. Спасибо!
— am2021