效果图

xiaoguotu
目的:等号左侧任意给定数,右侧给定数,输出以左侧数字经过一定运算达到的等式。

源码

1
2
3
4
5
6
7
8
9
10
from itertools import product
#万 能 论 证 机
a = '1 1 4 5 1 4'
a1, a2, a3, a4, a5, a6 = a.split(' ')
i = ['', '+', '-', '*', '/']
l = list(product(i, repeat=5))
for item in l:
c = a1+item[0]+a2+item[1]+a3+item[2]+a4+item[3]+a5+item[4]+a6
if eval(c) == 24:
print(c+' = 24')

原理

一句话:通过排列组合的方式,遍历所有可能性,输出符合条件的表达式。
代码具体分析:

  • a1, a2, a3, a4, a5, a6 = a.split(' ')
    链式赋值

  • l = list(product(i, repeat=5))
    这行代码的意思是将“+-*/空格”进行排列组合(自身笛卡尔积),遍历其组成5个元素时的排列组合所有情况(因为a1到a6之间的间隙为5,所以这里repeat次数为5)。

简单的案例:

1
2
3
import itertools
for i in itertools.product('ABCD', repeat=2):
print (''.join(i),end=' ')

输出结果:AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD

函数具体理解:

product 用于求多个可迭代对象的笛卡尔积(Cartesian Product)。

特性:product(A, B) 等价于 ((x,y) for x in A for y in B)。

一般使用形式:

itertools.product(*iterables, repeat=1)

iterables是可迭代对象,repeat指定iterable重复几次。

相关链接:

后记

这是人工智能课(我的选修课,不是我的专业课)上布置的小作业,作业具体要求是:

请在数字之间填上加减乘除或者空这五种符号,让等式可以成立,1 2 3 … 9 = 2008(空符号就是把两位或多位数字合成一个数字)

作业源码:

1
2
3
4
5
6
7
8
9
from itertools import product
a = '1 2 3 4 5 6 7 8 9'
a1, a2, a3, a4, a5, a6, a7, a8, a9 = a.split(' ')
i = ['', '+', '-', '*', '/']
l = list(product(i, repeat=8))
for item in l:
c = a1+item[0]+a2+item[1]+a3+item[2]+a4+item[3]+a5+item[4]+a6+item[5]+a7+item[6]+a8+item[7]+a9
if eval(c) == 2008:
print(c+' = 2008')

输出结果:

1+2+345*6+7-8*9 = 2008
1+2+345*6-7*8-9 = 2008