Магический квадрат в питоне

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

s = []
while len(s) < 9:
    n = 0
    a = random.randrange(1, 10)
    while a not in s:
        s.append(a)


while s[0] + s[1] + s[2] != 15 and s[3] + s[4] + s[5] != 15 and \
        s[6] + s[7] + s[8] != 15 and s[0] + s[4] + s[8] != 15 \
        and s[2] + s[4] + s[6] != 15 and s[0] + s[3] + s[6] != 15 and \
        s[1] + s[4] + s[7] != 15 and s[2] + s[5] + s[8] != 15:
    shuffle(s)
print(s)

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
490
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я думаю, вы неправильно написали условие своего цикла. В настоящее время требуется, чтобы сумма никто строк, столбцов или диагоналей составляла правильное значение. Если какой-либо из них это делает, он завершает работу, поскольку связанные цепочки and приводят к значению False.

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

Или, в качестве альтернативы, вы можете сохранить операторы and, но изменить операторы != на == и отменить все это в конце (поскольку not X or not Y логически эквивалентен not (X and Y)):

while not (s[0] + s[1] + s[2] == 15 and s[3] + s[4] + s[5] == 15 and 
           s[6] + s[7] + s[8] == 15 and s[0] + s[4] + s[8] == 15 and
           s[2] + s[4] + s[6] == 15 and s[0] + s[3] + s[6] == 15 and
           s[1] + s[4] + s[7] == 15 and s[2] + s[5] + s[8] == 15):

Большое спасибо, да, вы правы, как только первые критерии будут выполнены, цикл while останавливается, потому что требовалось одновременное выполнение всех критериев, но мы только что решили критерий ... так что это не так. больше не тасовать. Еще раз спасибо!

bucephalusII 19.11.2018 00:03

Я думаю, вы хотите заменить свои «и» на «или». Программа завершается, как только выполняется первое условие, потому что логически, как вы ее написали, все эти условия должны быть выполнены для продолжения. Кроме того, хотя это и не является строго необходимым, я обычно обнаружил, что скобки вокруг индивидуальных логических условий обычно помогают.

s = []
while len(s) < 9:
    n = 0
    a = random.randrange(1, 10)
    while a not in s:
        s.append(a)


while (s[0] + s[1] + s[2] != 15) or (s[3] + s[4] + s[5] != 15) or \
    (s[6] + s[7] + s[8] != 15) or (s[0] + s[4] + s[8] != 15) \
    or (s[2] + s[4] + s[6] != 15) or (s[0] + s[3] + s[6] != 15) or \
    (s[1] + s[4] + s[7] != 15) or (s[2] + s[5] + s[8] != 15):
    shuffle(s)
print(s)

Пожалуйста, покажите пример того, как это будет с OR, поскольку ответы без примеров будут привлекать отрицательные голоса.

Shiko 18.11.2018 23:56

Большое спасибо, да, читая ваш комментарий, я только что понял, как только первые критерии будут выполнены, он останавливается, потому что тогда while больше не `` активируется '' (отсутствует 1 критерий)

bucephalusII 19.11.2018 00:01

Другие вопросы по теме