题解 | #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))