Магический квадрат в питоне - PullRequest
0 голосов
/ 19 ноября 2018

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

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

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

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)
0 голосов
/ 19 ноября 2018

Я думаю, что вы написали условие вашего цикла неправильно.В настоящее время требуется, чтобы none из строк, столбцов или диагоналей суммировалось до нужного значения.Если какой-либо из них это сделает, он завершает работу, поскольку цепочка and s приводит к значению 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):
...