题解 | #24点运算#

24点运算

https://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d

import random  # 加强:随机抽取


def turn_num(lst):  # 返回数值列表;处理J Q K A JOKER joker
    for i in lst:
        if "joker" in lst or "JOKER" in lst:
            return []
        else:
            dict01 = {"J": 11, "Q": 12, "K": 13, "A": 1}
            lst01 = [dict01[i] if i in dict01 else int(i) for i in lst]  # 全部int
            return lst01


def cal(lst, tar, res):
    """
    动态规划求表达式
    :param lst: 没用过的数字列表
    :param tar: 目标答案
    :param res: 表达式
    :return:
    """
    dict01 = {"J": 11, "Q": 12, "K": 13, "A": 1}

    if len(lst) == 1 and tar == lst[0]:
        rlst.append(str(lst[0]) + res)

    else:
        for i in range(len(lst)):
            lst01 = lst[:i] + lst[i + 1 : :]
            cal(lst01, tar - lst[i], "+" + str(lst[i]) + res)
            cal(lst01, tar + lst[i], "-" + str(lst[i]) + res)
            cal(lst01, tar * lst[i], "/" + str(lst[i]) + res)
            cal(lst01, tar / lst[i], "*" + str(lst[i]) + res)


def tran(s):
    s = s.replace("11", "J", 4)
    s = s.replace("12", "Q", 4)
    s = s.replace("13", "K", 4)
    s = s.replace("1", "A", 4)
    return s


if __name__ == "__main__":
    while 1:
        rlst = []  # 记录结果的同时不影响迭代
        try:
            lst = input().split()  # 4张牌
            lst01 = turn_num(lst)  # 整理成数字

            if not lst01:  # 有大小joker报错
                print("ERROR")
                break
            cal(lst01, 24, "")

            if not rlst:
                print("NONE")
            else:
                r1 = random.randrange(len(rlst))
                r = tran(rlst[r1])
                print(r)  # 有多组答案的时候随机出现一个

        except:
            break

全部评论

相关推荐

码农索隆:想看offer细节
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务