Магический квадрат Ло Шу (Python)

Я написал программу на 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 ответ
1

Ваше решение жестко запрограммировано для матриц размера 3×3 — почему бы также не поддерживать матрицы произвольного размера? Также сложно поддерживать и отлаживать ваш код, т. Е. Легко где-то напортачить, когда вы индексируете свои строки и столбцы. Кроме того, представьте, что вы хотите рассмотреть более крупные матрицы: какой кошмар сейчас измените существующую логику!

Более надежное решение может превратиться в тупой. В частности, вы можете проверить суммы строк и столбцов, выполнив m.sum() а также m.sum(axis=1), и вычислить суммы диагоналей через m.trace() или по sum(np.diag(m)) а также sum(np.diag(np.fliplr(m)).

В качестве общего комментария просто верните логическое значение из вашей функции. Пусть основная программа решает, что делать с этим значением, т.е. печатать ли «это хорошо», «это магический квадрат Ло Шу» или что-то еще. Таким образом, ваша функция проверки остается чистой и более общей.

  • В этом есть смысл. Это именно то, что я искал — способ, отличный от жесткого кодирования. Спасибо!

    — am2021

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *