寻找唯一解谜题 python
Finding unique solution puzzle python
x = np.array([[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
[1,5,11],[1,6,11],[2,7,11],[2,8,10]])
我对此很陌生,所以我要这样称呼 [element1,element2,element3]
我有一个如上所示的数组,我想找到这个数组的解决方案。
它应该满足以下条件:
第0个元素:
它应该至少有一个来自 [0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9]
的解决方案
第一个元素1:
这个:[1,7,9],[1,5,11],[1,6,11]
第2个元素:
还有这个:[2,7,11],[2,8,10]
使得每个解的第二个元素和第三个元素都是唯一的(其中第一个元素=0,第二个元素=1,第三个元素=2)
o/p 可以是:
[0,1,11]
和 [1,7,9]
和 [2,8,10]
错误的输出:
[0,1,11], [1,6,11] ,[2,8,10]
这里第一个和第二个参数3相同
如果我没理解错的话,您想从给定的 x
数组中生成三元组,以便第一个、第二个和第三个元素在一个三元组中都是唯一的。执行此操作的代码:
import itertools
x = [[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
[1,5,11],[1,6,11],[2,7,11],[2,8,10]]
triplets = itertools.combinations(x,3)
for t in triplets:
isGood = True
for pos in range(3):
if (t[0][pos] == t[1][pos] or t[0][pos] == t[2][pos] or t[1][pos] == t[2][pos]):
isGood = False
if (isGood):
print(repr(t))
这会产生以下输出:
([0, 1, 11], [1, 7, 9], [2, 8, 10])
([0, 2, 11], [1, 7, 9], [2, 8, 10])
([0, 5, 9], [1, 6, 11], [2, 8, 10])
([0, 6, 9], [1, 5, 11], [2, 8, 10])
一个更 pythonic 的解决方案,只用 3 行就可以完成同样的工作
for t in itertools.combinations(x,3):
if all(len(col) == len(set(col)) for col in zip(*t)):
print(repr(t))
疯狂的单线:
print(''.join(repr(t) + '\n' for t in itertools.combinations(x,3) if all(len(col) == len(set(col)) for col in zip(*t))))
x = np.array([[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
[1,5,11],[1,6,11],[2,7,11],[2,8,10]])
我对此很陌生,所以我要这样称呼 [element1,element2,element3]
我有一个如上所示的数组,我想找到这个数组的解决方案。 它应该满足以下条件:
第0个元素:
它应该至少有一个来自 [0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9]
第一个元素1:
这个:[1,7,9],[1,5,11],[1,6,11]
第2个元素:
还有这个:[2,7,11],[2,8,10]
使得每个解的第二个元素和第三个元素都是唯一的(其中第一个元素=0,第二个元素=1,第三个元素=2)
o/p 可以是:
[0,1,11]
和 [1,7,9]
和 [2,8,10]
错误的输出:
[0,1,11], [1,6,11] ,[2,8,10]
这里第一个和第二个参数3相同
如果我没理解错的话,您想从给定的 x
数组中生成三元组,以便第一个、第二个和第三个元素在一个三元组中都是唯一的。执行此操作的代码:
import itertools
x = [[0,1,11],[0,2,11],[0,3,10],[0,4,10],[0,5,9],[0,6,9],[1,7,9],
[1,5,11],[1,6,11],[2,7,11],[2,8,10]]
triplets = itertools.combinations(x,3)
for t in triplets:
isGood = True
for pos in range(3):
if (t[0][pos] == t[1][pos] or t[0][pos] == t[2][pos] or t[1][pos] == t[2][pos]):
isGood = False
if (isGood):
print(repr(t))
这会产生以下输出:
([0, 1, 11], [1, 7, 9], [2, 8, 10])
([0, 2, 11], [1, 7, 9], [2, 8, 10])
([0, 5, 9], [1, 6, 11], [2, 8, 10])
([0, 6, 9], [1, 5, 11], [2, 8, 10])
一个更 pythonic 的解决方案,只用 3 行就可以完成同样的工作
for t in itertools.combinations(x,3):
if all(len(col) == len(set(col)) for col in zip(*t)):
print(repr(t))
疯狂的单线:
print(''.join(repr(t) + '\n' for t in itertools.combinations(x,3) if all(len(col) == len(set(col)) for col in zip(*t))))