חידת המרובע הקסום הראשוני היא חידה שבה צריך להציב תשעה מן המספרים הראשוניים בין אחד למאה(1 נכלל במספרים הראשוניים) כדי ליצור ריבוע(3x3) שבו הסכום המספרים בכל שורה, טור ואלכסון הוא 111.
בתוכנה השתמשתי בשיטת הבקטרייסינג בכדי לקבל את התוצאה.
הקוד:
def print_board(l):
print(f'{l[0]} | {l[1]} | {l[2]}')
print("------------")
print(f'{l[3]} | {l[4]} | {l[5]}')
print("------------")
print(f'{l[6]} | {l[7]} | {l[8]}')
def is_prime(num):
if num == 2 or num == 1:
return True
else:
pl = [i for i in range(2,num)]
for item in pl:
if num%item != 0:
pass
else:
return False
return True
primes = list(filter(is_prime, [i for i in range(1, 100)]))
board = [0 for i in range(9)]
o1 = primes[::]
for item1 in o1:
board[0] = item1
o2 = primes[::]
o2.remove(board[0])
ro2 = []
for item in o2:
if item+board[0]>13 and item+board[0] < 111:
ro2.append(item)
for item2 in ro2:
board[1] = item2
o3 = primes[::]
o3.remove(board[0]), o3.remove(board[1])
ro3 = []
if (111-(board[0]+board[1])) in o3:
ro3.append(111-(board[0]+board[1]))
for item3 in ro3:
board[2] = item3
o4 = primes[::]
o4.remove(board[0]), o4.remove(board[1]), o4.remove(board[2])
ro4 = []
for item in o4:
if item+board[0] > 13 and item+board[0] < 111:
ro4.append(item)
for item4 in ro4:
board[3] = item4
o5 = primes[::]
o5.remove(board[0]), o5.remove(board[1]), o5.remove(board[2]), o5.remove(board[3])
ro5 = []
for item in o5:
if item+board[0] > 13 and item+board[0] < 111 and item+board[1] > 13 and item+board[1] < 111 and item+board[2] > 13 and item+board[2] < 111 and item+board[3] > 13 and item+board[3] < 111:
ro5.append(item)
for item5 in ro5:
board[4] = item5
o6 = primes[::]
o6.remove(board[0]), o6.remove(board[1]), o6.remove(board[2]), o6.remove(board[3]), o6.remove(board[4])
ro6 = []
if (111-(board[3]+board[4])) in o6 and ((111-(board[3]+board[4]))+board[2]) > 13 and ((111-(board[3]+board[4]))+board[2]) < 111:
ro6.append(111-(board[3]+board[4]))
for item6 in ro6:
board[5] = item6
o7 = primes[::]
o7.remove(board[0]), o7.remove(board[1]), o7.remove(board[2]), o7.remove(board[3]), o7.remove(board[4]), o7.remove(board[5])
ro7 = []
if (111-(board[0]+board[3])) in o7 and ((111-(board[0]+board[3]))+board[2]+board[4]) == 111:
ro7.append(111-(board[0]+board[3]))
for item7 in ro7:
board[6] = item7
o8 = primes[::]
o8.remove(board[0]), o8.remove(board[1]), o8.remove(board[2]), o8.remove(board[3]), o8.remove(board[4]), o8.remove(board[5]), o8.remove(board[6])
ro8 = []
if (111-(board[1]+board[4])) in o8 and (111-(board[1]+board[4]))+board[6] > 13 and (111-(board[1]+board[4]))+board[6] < 111:
ro8.append(111-(board[1]+board[4]))
for item8 in ro8:
board[7] = item8
o9 = primes[::]
o9.remove(board[0]), o9.remove(board[1]), o9.remove(board[2]), o9.remove(board[3]), o9.remove(board[4]), o9.remove(board[5]), o9.remove(board[6]), o9.remove(board[7])
ro9 = []
if (111-(board[6]+board[7])) in o9 and (111-(board[6]+board[7]))+board[2]+board[5] == 111 and (111-(board[6]+board[7]))+board[0]+board[4] == 111:
ro9.append(111-(board[6]+board[7]))
for item9 in ro9:
board[8] = item9
print_board(board)
print("--------------------------------------------")
board[8] = item9
board[7] = 0
board[6] = 0
board[5] = 0
board[4] = 0
board[3] = 0
board[2] = 0
board[1] = 0
board[0] = 0
אחרי כל צעד אני מחזיר את התא למצב הראשוני שלו-0.
אני מוריד את האפשרויות הלא הגיוניות ובכך נשאר עם מעט אפשרויות...
התוכנה עובדת מהר מאוד(פחות משנייה) ומביאה 8 תוצאות(שהם בעצם אותה התוצאה רק מסובבת ומראה).
Answer:
7 | 61 | 43
------------
73 | 37 | 1
------------
31 | 13 | 67
--------------------------------------------
7 | 73 | 31
------------
61 | 37 | 13
------------
43 | 1 | 67
--------------------------------------------
31 | 13 | 67
------------
73 | 37 | 1
------------
7 | 61 | 43
--------------------------------------------
31 | 73 | 7
------------
13 | 37 | 61
------------
67 | 1 | 43
--------------------------------------------
43 | 1 | 67
------------
61 | 37 | 13
------------
7 | 73 | 31
--------------------------------------------
43 | 61 | 7
------------
1 | 37 | 73
------------
67 | 13 | 31
--------------------------------------------
67 | 1 | 43
------------
13 | 37 | 61
------------
31 | 73 | 7
--------------------------------------------
67 | 13 | 31
------------
1 | 37 | 73
------------
43 | 61 | 7
--------------------------------------------
Nice site, nice and easy on the eyes and great content too. Do you need many drafts to make a post? Perdana lottery result