我设法想出了一个解决方案(假设itertools
已经导入):
def reduct(length, n=5):
return [i for i in \
itertools.combinations_with_replacement(range(1, 10), length) \
if ((sum(i) - 1) % 9 + 1) == n]
这将返回“减少”到的所有唯一组合n
,这是5
默认情况下的。
解释:
itertools.combinations_with_replacement(range(1, 10), length)
产生length
一位数字的所有唯一组合(不包括0
)。请参阅文档。
((sum(i) - 1) % 9 + 1)
产生每个组合的“减少”。它使用数字根公式((n - 1) % 9 + 1
,n
作为组合中数字的总和。
- 其余的都是不言自明的(我希望)。
一些测试运行:
>>> reduct(2)
[(1, 4), (2, 3), (5, 9), (6, 8), (7, 7)]
>>> reduct(3)
[(1, 1, 3), (1, 2, 2), (1, 4, 9), (1, 5, 8), (1, 6, 7), (2, 3, 9),
(2, 4, 8), (2, 5, 7), (2, 6, 6), (3, 3, 8), (3, 4, 7), (3, 5, 6),
(4, 4, 6), (4, 5, 5), (5, 9, 9), (6, 8, 9), (7, 7, 9), (7, 8, 8)]
>>> len(reduct(7))
715
指定自定义n
:
>>> reduct(2, 8)
[(1, 7), (2, 6), (3, 5), (4, 4), (8, 9)]
>>> reduct(3, 8)
[(1, 1, 6), (1, 2, 5), (1, 3, 4), (1, 7, 9), (1, 8, 8), (2, 2, 4),
(2, 3, 3), (2, 6, 9), (2, 7, 8), (3, 5, 9), (3, 6, 8), (3, 7, 7),
(4, 4, 9), (4, 5, 8), (4, 6, 7), (5, 5, 7), (5, 6, 6), (8, 9, 9)]
>>> len(reduct(7, 8))
715