Python破解和为24的四则运算
import random
import itertools
#加减乘数四则运算符号
caozuofu=['+','-','*','/']
#返回数值
def num():
return [str(random.randint(1,13)) for x in range(4)]
def shuru_num():
return [str(int(input(f"输入第{x}个数字-->")) )for x in ['一','二','三','四']]
#开始运算
def yunsuan(x,y,fuhao):
return '('+str(x)+fuhao+str(y)+')'
#遍历单组结果-->使用枚举法
def bianli(ls,k=None):
return list(itertools.permutations(ls,k))
#将所有可能存入列表arr2之中-->返回
def diedai(a,b,c,d):
arr=[];arr1=[];arr2=[]
for j in caozuofu:
arr.append(yunsuan(a,b,j))
for u in arr:
for e in caozuofu:
arr1.append(yunsuan(u,c,e))
for u in arr1:
for e in caozuofu:
arr2.append(yunsuan(u,d,e)[1:-1])
return list(set(arr2))
#进行去重操作-->进行字段互换,然后发现剩余的里面是否存在这个数字,如果有加入新的列表之后,遍历之后再次删除即可
def quchong01(ls):
#关于前面的两个-->交换一下前面和后面的位置
yun = ls[2:ls.find(")")]
yunsuan = list(set(yun) & set(caozuofu))[0]
yuan, xian = yun.split(yunsuan)
return yun,xian+yunsuan+yuan
def quchong02(ls):
yun = ls[ls.find(")") + 2:]
yun01=yun.replace(')', '')
yunsuan = list(set(yun01) & set(caozuofu))[0]
yuan, xian = yun01.split(yunsuan)
return yun,xian+')'+yuan
def quchong03(ls):
yun = ls[ls.find(")") + 1:]
i,j=yun.split(")")
return yun,j+')'+i
#实现交换操作-->也可以理解为去重操作-->本质是交换去替代
def jiaohuan(ls):
move=[];result=ls;changdu=len(result)
for x in range(changdu):
zu=ls[x]
yuan,xian=quchong01(zu)
xin=zu.replace(yuan,xian)
if xin in ls[x:]:
move.append(xin)
for x in move:
result.remove(x)
move = [];changdu = len(result)
for x in range(changdu):
zu = ls[x]
yuan, xian = quchong02(zu)
xin = zu.replace(yuan, xian)
if xin in ls[x:]:
move.append(xin)
for x in move:
result.remove(x)
move = [];changdu = len(result)
for x in range(changdu):
zu = ls[x]
yuan, xian = quchong03(zu)
xin = zu.replace(yuan, xian)
if xin in ls[x:]:
move.append(xin)
for x in move:
result.remove(x)
return result
#实现交互输入
def in_num():
nu=int(input("随机输入:0/手动输入为除0外的所有数字:-->"))
if nu:
return shuru_num()
else:
return num()
def main():
ls=in_num()
# ls=['8', '13', '7', '9']
print(f'生成的四个数字-->{" ".join(ls)}')
result=bianli(ls)
suoyouzuhe=[]
for i in result:
a,b,c,d=i
suoyouzuhe+=diedai(a,b,c,d)
count=0
end_result=[]
for x in suoyouzuhe:
if eval(x)==24:
end_result.append(x)
count+=1
else:
if count==0:
print("这四个数字不能组成和为24组合")
return 0
return end_result
if __name__ == '__main__':
end_result=main()
if end_result:#对于返回值的判定-->0直接退出,正常列表则遍历显示
print("随机组合和为24的结果有↓↓↓")
for x in range(len(jiaohuan(end_result))-1):
print(f' {jiaohuan(end_result)[x]} ',end='或')
print(f'{jiaohuan(end_result)[-1]}')
感兴趣的朋友可以作为简略版课程设计!
如果你有好的策略的话可以交流交–qq:2386712408
借鉴过一位博主的,但忘了是哪个博主.见谅!