# 第一部分:定义牌的数值
# 记录了每张牌对应的分数,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))