用python解决24点(现实升级版)

上篇文章已经解决输入例如['1','2','3','4']列表的24点生成方法,那么在现实生活中,我们在玩24点时,抽到牌并不是这一串数字,实际上可能是例如['方片A','梅花A','红桃K','黑桃3']这样四张牌,并且抽到A时,A可以为1或14,那么这样该如何解决呢?

                     

首先思路是将这些牌转化为之前程序里熟悉的列表类型,将’黑桃‘,‘方块’等等删去,然后将J,Q,K转化为11,12,13,而A则转为为一个列表[1,14],我们可以通过笛卡尔乘积的方式,利用itertools中的product函数来实现,将这组数据重新生成一个新的二维列表,那么之后,利用上篇文章的计算函数就能轻松解决了。代码如下:

from itertools import permutations
from itertools import product
operators =  ['+','-','*','/']
def add_brace(numbers):
    if len(numbers)< 2:return [numbers]
    if len(numbers) ==2 :return [['('+str(numbers[0])]+numbers[1:-1]+[str(numbers[1])+')']]
    results =[]
    
    for j in range(1,len(numbers)):
        prefixs = add_brace(numbers[:j])
        tails = add_brace(numbers[j:])
        for p in prefixs:
            for t in tails:
                with_around_brach = ['(' + p[0]] +p[1:] +t[:-1] +[t[-1] +')']
                results.append(with_around_brach)
    return results

def join_operators_number(operators,with_brace):
    finally_exp = with_brace[0]
    for i,op in enumerate(operators):
        finally_exp += (op + with_brace[i+1])
    return finally_exp

def finally_count(cards):
    target =24
    for i in permutations(cards):
        for j in product(operators,repeat = len(cards)-1):
            add_brace_number = add_brace(list(i))
            for t in add_brace_number:
                try:
                    cc =join_operators_number(j,t)
                    if eval(cc)==target:print(cc)
                except ZeroDivisionError:
                    continue
---------------------------------------------------------------------------------------

def initial_conversion_function(cards): #新函数
    start_list_one=[]
    for i in cards:
        start_list_one.append(i.replace('梅花','').replace('方片','').replace('红桃','').replace('黑桃','').replace('J','11').replace('Q','12').replace('K','13'))
    nn = [i for i,j in enumerate(start_list_one) if j =='A'] #判断A的位置并返回下标值列表
    for i in nn:  #将'A'替换为列表['1','14']
        start_list_one[i]= ['1','14']
    list_two =[]
    for i in start_list_one:  #将字符串转化为数字,因为product函数在处理两位数以上的字符串时,会将字符串拆分处理,而数字则不会
        if isinstance(i,list):
            list_two.append([int(x) for x in i])
        else:
            list_two.append([int(i)])
    list_three =[]
    for i in product(list_two[0],list_two[1],list_two[2],list_two[3]):
        slist = [str(k) for k in i]
        list_three.append(slist)
    return list_three

我们随意带入一组数据试试:

your_cards = ['方片3','梅花A','红桃K','黑桃4']
for i in initial_conversion_function(your_cards):
    print('组合{}'.format(i))
    finally_count(i)   

结果如下:

组合['3', '1', '13', '4']
(3*(13-(1+4)))
(3*((13-1)-4))
(3*(13-(4+1)))
(3*((13-4)-1))
(((3*4)-1)+13)
((3*4)-(1-13))
((3*4)+(13-1))
(((3*4)+13)-1)
(13+((3*4)-1))
((13+(3*4))-1)
((13-1)+(3*4))
(13-(1-(3*4)))
((13-1)+(4*3))
((13-(1+4))*3)
(13-(1-(4*3)))
(((13-1)-4)*3)
(13+((4*3)-1))
((13+(4*3))-1)
((13-(4+1))*3)
(((13-4)-1)*3)
(((4*3)-1)+13)
((4*3)-(1-13))
((4*3)+(13-1))
(((4*3)+13)-1)
组合['3', '14', '13', '4']

组合后面没有结果表明该组合不能计算出24点。

  出现多个A时,如下:

your_cards = ['方片3','梅花A','红桃A','黑桃A']
for i in initial_conversion_function(your_cards):
    print('组合{}'.format(i))
    finally_count(i)    

结果如下:
组合['3', '1', '1', '1']
组合['3', '1', '1', '14']
组合['3', '1', '14', '1']
组合['3', '1', '14', '14']
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
((14-(1+3))+14)
(14-(1+(3-14)))
(14-((1+3)-14))
(((14-1)-3)+14)
((14-1)-(3-14))
((14-1)+(14-3))
(((14-1)+14)-3)
(14-((1-14)+3))
(14-(1-(14-3)))
((14-(1-14))-3)
(14+(14-(3+1)))
((14+14)-(3+1))
(14+((14-3)-1))
((14+(14-3))-1)
(((14+14)-3)-1)
(14+(14-(1+3)))
((14+14)-(1+3))
(14+((14-1)-3))
((14+(14-1))-3)
(((14+14)-1)-3)
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
((14-(1+3))+14)
(14-(1+(3-14)))
(14-((1+3)-14))
(((14-1)-3)+14)
((14-1)-(3-14))
((14-1)+(14-3))
(((14-1)+14)-3)
(14-((1-14)+3))
(14-(1-(14-3)))
((14-(1-14))-3)
(14+(14-(3+1)))
((14+14)-(3+1))
(14+((14-3)-1))
((14+(14-3))-1)
(((14+14)-3)-1)
(14+(14-(1+3)))
((14+14)-(1+3))
(14+((14-1)-3))
((14+(14-1))-3)
(((14+14)-1)-3)
组合['3', '14', '1', '1']
组合['3', '14', '1', '14']
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
.....

以上就是本文的内容。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值