用一串数字产生加法、减法或什么都不做的变化来使 100

With a string of numbers generate variations with addition, subtraction or nothing to make 100

我有一串数字,string="123456789" 我想打印所有变体,在数字之间插入加法、减法或什么都不插入,以使 100.The 数字的顺序大部分保持不变。

例子:1+2+3-4+5+6+78+9=100

我什至不确定如何开始。我想列出 +-x 的所有可能组合(x 代表什么)并插入每个组合并进行测试,但这似乎需要很长时间。 有什么建议吗?

您可以使用 product and zip_longest from the itertools module. We build up all possible combinations, and then evaluate 过滤仅评估为 100 的那些。

from itertools import product, zip_longest

operations = ['-', '+', '']
s = '123456789'

combinations = (zip_longest(s, ops, fillvalue='') for ops in product(operations, repeat=8))

to_eval = (''.join(i + j for i, j in combination) for combination in combinations)

print([i for i in to_eval if eval(i) == 100])

>>> ['1+2+3-4+5+6+78+9', '1+2+34-5+67-8+9', '1+23-4+5+6+78-9', '1+23-4+56+7+8+9', '12-3-4+5-6+7+89', '12+3-4+5+67+8+9', '12+3+4+5-6-7+89', '123-4-5-6-7+8-9', '123-45-67+89', '123+4-5+67-89', '123+45-67+8-9']

eval() 本质上并不坏,只是如果任何用户输入可以进入您正在评估的东西(这不是这里的情况)。为个人项目这样做很好。在生产环境中,您可能希望自己解析字符串或寻找不同的方法。

优化注意事项请看这里:

a = ['+', '-', '']
nb = '123456789'
target = 100
N = len(nb)-1

for n in range(3**N):
    attempt = nb[0]
    for i in range(N):
        attempt += a[n % 3]
        attempt += nb[i+1]
        n = n // 3
    if eval(attempt) == target:
        print(attempt, ' = ', target)

导致

1+23-4+56+7+8+9  =  100
12+3-4+5+67+8+9  =  100
1+2+34-5+67-8+9  =  100
1+2+3-4+5+6+78+9  =  100
123-4-5-6-7+8-9  =  100
123+45-67+8-9  =  100
1+23-4+5+6+78-9  =  100
12-3-4+5-6+7+89  =  100
12+3+4+5-6-7+89  =  100
123-45-67+89  =  100
123+4-5+67-89  =  100