Я новичок в программировании. Пытаюсь запрограммировать магический квадрат. Магический квадрат - это квадрат (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.






Я думаю, вы неправильно написали условие своего цикла. В настоящее время требуется, чтобы сумма никто строк, столбцов или диагоналей составляла правильное значение. Если какой-либо из них это делает, он завершает работу, поскольку связанные цепочки 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):
Я думаю, вы хотите заменить свои «и» на «или». Программа завершается, как только выполняется первое условие, потому что логически, как вы ее написали, все эти условия должны быть выполнены для продолжения. Кроме того, хотя это и не является строго необходимым, я обычно обнаружил, что скобки вокруг индивидуальных логических условий обычно помогают.
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, поскольку ответы без примеров будут привлекать отрицательные голоса.
Большое спасибо, да, читая ваш комментарий, я только что понял, как только первые критерии будут выполнены, он останавливается, потому что тогда while больше не `` активируется '' (отсутствует 1 критерий)
Большое спасибо, да, вы правы, как только первые критерии будут выполнены, цикл while останавливается, потому что требовалось одновременное выполнение всех критериев, но мы только что решили критерий ... так что это не так. больше не тасовать. Еще раз спасибо!