我正在尝试将一个不正确的3X3魔方转换为适当的3X3魔方。这是我的代码:
from itertools import *
def ms():
magic_squares = [
[8,1,6],[3,5,7],[4,9,2],
[6,1,8],[7,5,3],[2,9,4],
[4,3,8],[9,5,1],[2,7,6],
[2,7,6],[9,5,1],[4,3,8],
[2,9,4],[7,5,3],[6,1,8],
[4,9,2],[3,5,7],[8,1,6],
[6,7,2],[1,5,9],[8,3,4],
[8,3,4],[1,5,9],[6,7,2]
]
for p in permutations(range(1,10)):
if all(sum(p[i] for i in r) == 15 for r in magic_squares):
yield list(p)
def closest_ms(m):
m = sum(m, [])
return min(ms(), key = (lambda x: sum(i != j for i,j in zip(m,x))))
s = []
smo = []
for s_i in range(3):
s_t = [int(s_temp) for s_temp in input().strip().split(' ')]
s.append(s_t)
important_var = closest_ms(s)
print(important_var)
正如你所看到的,由于有8个正确的3X3魔方,我试图利用它们中的8个通过可能的最小变化将不正确的魔方转换为适当的魔方(使用数字1- 9)。例如,我有一个像这样的魔方:
[[5,3,4],[1,5,8],[6,4,2]]
输出应该是这样的,只需要很小的改动:
[[8,3,4],[1,5,9],[6,7,2]]
但是我的代码给了我这个错误:第14行IndexError: tuple index out of range
如何解决此错误并使我的代码按预期工作?
答案 0 :(得分:1)
我没有想到你的算法,但我可以看到问题出在这里:
all(sum(p[i] for i in r) == 15 for r in magic_squares)
每个r是包含数字1-9的3元素列表。因此i的可能值范围为1-9。但是p是数字1-9的排列,因此p是具有9个元素的元组。 p的指数范围为0-8。