python用扑克牌计算24点

一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。

输入格式:
输入在一行中给出 4 个整数,每个整数取值在 [1, 13]。

输出格式:
输出任一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,请输出 -1。

输入样例:
2 3 12 12
输出样例:
((3-2)*12)+12

#!/usr/bin/python
# -*- coding: UTF-8 -*-
"""
@author: YangPC
@time:2021/07/02
@QQ:327844761
@微信公众号:ewbang
"""

# 二十四点
import os
from time import sleep
from time import perf_counter
import random

global Goal
Goal = 24


# 得到四个用户输入值
def getNumbers():
    a = int(input("请输入第1个值:"))
    b = int(input("请输入第2个值:"))
    c = int(input("请输入第3个值:"))
    d = int(input("请输入第4个值:"))
    print(f"输入的数值为:{a},{b},{c},{d}")
    return f"{a} {b} {c} {d}"


# 穷举所有的数值列表
# 共4!=24种
def getNumList(numbers):
    items = numbers.split()
    data_list = [(items[i] + ' ' + items[j] + ' ' + items[p] + ' ' + items[q]) for i in range(4) for j in range(4) for p
                 in range(4) for q in range(4) if (i != j) & (i != p) & (i != q) & (j != p) & (j != q) & (p != q)]
    # 使用set方法排除冗余的数字组合
    # 当输入的数字中存在重复数字,则4!=24种排序方案会存在重复,必须排除
    return set(data_list)


# 穷举所有的操作符列表
# 共4x4x4=64种
def getOplist(ops):
    op_list = [ops[i] + ' ' + ops[j] + ' ' + ops[p] for i in range(4) for j in range(4) for p in range(4)]
    return op_list


# 计算24点
def Cal(num_list, opt_list):
    res = []
    for numlist in num_list:
        nums = numlist.split()
        for oplist in opt_list:
            ops = oplist.split()
            Cal24(res, nums, ops)
    return random.choice(res) if len(res) > 0 else -1


# 对单种运算符顺序和单种数字顺序进行组合运算
def Cal24(res, nums, op):
    global Goal
    # 第一种情况 ((num0 op0 num1)op1 num2)op2 num3
    try:
        if round(eval("((" + nums[0] + op[0] + nums[1] + ")" + op[1] + nums[2] + ")" + op[2] + nums[3]), 0) == Goal:
            res.append("(({}{}{}){}{}){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
    # 第二种情况 (num0 op0 num1) op1 (num2 op2 num3)
    try:
        if round(eval("(" + nums[0] + op[0] + nums[1] + ")" + op[1] + "(" + nums[2] + op[2] + nums[3] + ")"),
                 0) == Goal:
            res.append("({}{}{}){}({}{}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
    # 第三种情况 ( num0 op0 ( num1 op1 num2 )) op2 num3
    try:
        if round(eval("(" + nums[0] + op[0] + "(" + nums[1] + op[1] + nums[2] + "))" + op[2] + nums[3]), 0) == Goal:
            res.append("({}{}({}{}{})){}{}={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
    # 第四种情况 num0 op0 (( num1 op1 num2 ) op2 num3 )
    try:
        if round(eval(nums[0] + op[0] + "((" + nums[1] + op[1] + nums[2] + ")" + op[2] + nums[3] + ")"), 0) == Goal:
            res.append("{}{}(({}{}{}){}{})={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass
    # 第五种情况 num0 op0 ( num1 op1 ( num2 op2 num3 ))
    try:
        if round(eval(nums[0] + op[0] + "(" + nums[1] + op[1] + "(" + nums[2] + op[2] + nums[3] + "))"), 0) == Goal:
            res.append("{}{}({}{}({}{}{}))={}".format(nums[0], op[0], nums[1], op[1], nums[2], op[2], nums[3], Goal))
    except:
        pass


if __name__ == '__main__':
    numbers = getNumbers()
    start = perf_counter()
    num_list = getNumList(numbers)
    opt_list = getOplist('+-*/')
    res = Cal(num_list, opt_list)
    print(f"输出结果:{res}")