题解 | #24点运算#

24点运算

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

# 第一部分:定义牌的数值
# 记录了每张牌对应的分数,A就是1分,2就是2分,以此类推,K是13分,小王和大王是特殊的,我们在这个游戏里不用它们。
card_values = {
    "A": 1,
    "2": 2,
    "3": 3,
    "4": 4,
    "5": 5,
    "6": 6,
    "7": 7,
    "8": 8,
    "9": 9,
    "10": 10,
    "J": 11,
    "Q": 12,
    "K": 13,
    "joker": 0,
    "JOKER": 0,
}
# 第二部分:生成所有可能的牌的排列
# 帮我们找到所有不同的牌的排列方式,比如你有四张牌,它会告诉你所有不同的排列顺序。
def generate_permutations(lst):
    if len(lst) == 0:
        return [[]]  # 如果没有牌,就没有排列方式。
    perms = []  # 这是我们用来保存所有排列的盒子。
    for i in range(len(lst)):  # 对于牌堆里的每一张牌,
        m = lst[i]  # 我们拿出这张牌,
        remLst = lst[:i] + lst[i + 1 :]  # 然后把剩下的牌留下。
        for p in generate_permutations(remLst):  # 对剩下的牌进行同样的操作,找出所有排列。
            perms.append([m] + p)  # 把当前拿出的牌放到每一种排列的前面。
    return perms  # 最后,我们得到了所有的排列方式!


# 第三部分:生成运算符的所有组合
# 现在我们来生成所有可能的运算符组合,就像我们有多种方式组合加减乘除一样。
def generate_operator_combinations(operators, length):
    if length == 1:
        return [[o] for o in operators]  # 如果只需要一个运算符,那就直接返回所有可能的运算符。
    combinations = []  # 这是我们用来保存所有组合的盒子。
    for o in operators:  # 对于每一个可能的运算符,
        for c in generate_operator_combinations(
            operators, length - 1
        ):  # 我们再次调用自己,找出剩下的组合。
            combinations.append([o] + c)  # 把当前的运算符添加到每一种组合的前面。
    return combinations  # 最后,我们得到了所有的运算符组合!


# 第四部分:计算表达式的值
# 这个函数可以计算给定牌和运算符的表达式值。
def calculate_expression(cards, operators):
    try:
        result = card_values[cards[0]]  # 我们从第一张牌的分数开始。
        for i, operator in enumerate(operators):  # 然后,对于每一个运算符,
            if operator == "+":  # 如果是加号,
                result += card_values[cards[i + 1]]  # 我们就加上下一张牌的分数。
            elif operator == "-":  # 同理,对于减号、乘号、除号,我们做相应的计算。
                result -= card_values[cards[i + 1]]
            elif operator == "*":
                result *= card_values[cards[i + 1]]
            elif operator == "/":
                result = result / card_values[cards[i + 1]]
        return result  # 最后,我们得到了这个表达式的结果!
    except ZeroDivisionError:  # 如果我们不小心除以0了,就返回None,因为这不是一个有效的操作。
        return None


# 第五部分:寻找24点的解决方案
# 这个函数是我们的主要任务,要找出24点的方案。
def find_24_solution(cards):
    if any(
        card in ["joker", "JOKER"] for card in cards
    ):  # 如果有大小王,就直接返回“ERROR”,因为我们不能用它们。
        return "ERROR"

    permutations = generate_permutations(cards)  # 生成所有牌的排列。
    operator_combinations = generate_operator_combinations(
        ["+", "-", "*", "/"], 3
    )  # 生成所有运算符的组合。

    for perm in permutations:  # 对于每一种牌的排列,
        for operators in operator_combinations:  # 和每一种运算符的组合,
            if calculate_expression(perm, operators) == 24:  # 如果这样算出来是24,
                return "".join(
                    [f"{perm[i]}{operators[i]}" for i in range(3)] + [perm[3]]
                )  # 就把这个方案返回出去。

    return "NONE"  # 如果找遍了所有的组合都没有24点,就返回“NONE”,意味着没有解决方案。


# 最后,我们从用户那里得到四张牌,然后尝试找出24点的方案。
cards = input().split()
print(find_24_solution(cards))

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务