2021-06-22

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

借鉴过一位博主的,但忘了是哪个博主.见谅!

[个人博客](Python破解和为24的四则运算 - 一远阁、 (xisunyy.top))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值