用一串数字产生加法、减法或什么都不做的变化来使 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
我有一串数字,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