Python Itertools:复杂的"产品"

Eri*_*ans 1 python product python-itertools

1+3+9 = 13 = 1+3 = 4.
6+1+1+5 = 13 = 1+3 = 4.
9+9+4 = 22 = 2+2 = 4.
etc
Run Code Online (Sandbox Code Playgroud)

考虑到前面的例子,可以说减少到4号的可能性达到无穷大.然而,可以控制在初始游戏中输入的数字位数.

def reduct(length):
    ...
    ...
    return reduction
Run Code Online (Sandbox Code Playgroud)

你们对我如何编写这样的函数有任何想法吗?我想输入一个"长度",并假设它为7,并假设结束减少为5,我希望它这样做:

x + x + x + x + x + x + x = 5.

它给了我x号码的所有可能性.

我花了太多时间试图解决问题,我无法弄清楚如何做到这一点.顺便说一句,这是一个非常好的编程练习(一个很好的挑战); 我非常感谢你的帮助.

Vol*_*ity 5

我设法想出一个解决方案(假设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]
Run Code Online (Sandbox Code Playgroud)

这将返回所有独特的组合是"减少"到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
Run Code Online (Sandbox Code Playgroud)

指定自定义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
Run Code Online (Sandbox Code Playgroud)