## 总体思路:排列组合
## 4个数字 + 3个运算符,构成表达式
## 4个数字全排列共24中情况,4个运算符实际上有3个参与计算,几何分布共64中情况
# 全排列,用递归实现
# lst:数字的列表
# temp:临时数据的列表。是一维的
# res:保存结果的列表。是二维度的
# 来源于AI搜索:用python程序实现对4个数字的全排列
def permute(lst, temp=[], res=[]):
if len(lst) == 0:
res.append(temp)
else:
for i in range(len(lst)):
permute(lst[:i] + lst[i + 1 :], temp + [lst[i]], res)
# 得到运算符的所有排列组合
# flag:运算符的列表,一维的。
# flagMatrix:运算符的所有排列组合,二维的
def total(flag, flagMatrix):
for i in flag:
for j in flag:
for k in flag:
temp = [i, j, k]
flagMatrix.append(temp)
temp = []
# 符号转数字
def get_digit(char):
if char == "J":
return 11
elif char == "Q":
return 12
elif char == "K":
return 13
elif char == "A":
return 1
else:
return int(char)
# 拼接出完整的表达式
# num:数字的列表
# flag:运算符的列表
def get_full_expression(num, flag):
exp = ""
exp += num[0] # 第一个数据先取出来,作为左边操作数
i = 1
while i <= 3: # 取3个数据、2个运算符
operation = flag[i-1]
exp += operation # 拼接运算符
rightNum = num[i]
exp += rightNum # 拼接右边操作数
i += 1
return exp
# 计算表达式的值
# num:数字的列表
# flag:运算符的列表
def get_value(num, flag):
full = get_full_expression(num, flag)
express = str(get_digit(num[0])) # 第一个数据先取出来
result = 0
for i in range(1, 4): # 取第1-3个数字、运算符,成对拼接. # 循环计算a+b
operation = flag[i-1]
express += operation # 拼接运算符
rightNum = str(get_digit(num[i]))
express += rightNum # 拼接右边操作数
result = eval(express) # 得到a+b形式的express时,马上计算1次运算结果
express = str(result) # 将结果作为新的a,循环计算。
# print("full={},result={}".format(full,result))
if result == 24:
return (24, full)
else:
return (-1, "NONE")
while True:
try:
num = input().split()
temp, numMatrix = [], []
permute(num, temp, numMatrix) ## 4个数全排列共4!(24)种,得到矩阵24*4
# print("numMatrix={}".format(numMatrix))
flag = ["+", "-", "*", "/"]
flagMatrix = []
total(flag, flagMatrix) ## 4个符号中的3个组成运算符,不是全排列,而是4*4*4=64种
# print("flagMatrix={}".format(flagMatrix))
if "joker" in num or "JOKER" in num:
print("ERROR")
else:
expression = []
ans = ""
response = []
for numRow in numMatrix: # 取每一组数字,共24次,一组4个,参与运算
for flagRow in flagMatrix: # 取每一组运算符,共64组,一组3个
response = get_value(numRow, flagRow) # 返回值包含拼接结果、计算结果
if response[0] == 24:
break
if response[0] == 24:
break
for i in response[1]: # 输出
print(i, end="")
except:
break