题解 | #24点运算#
24点运算
http://www.nowcoder.com/practice/7e124483271e4c979a82eb2956544f9d
用了python的itertools库里的permutatios来生成四个数字的全队列,不能加括号这个有点坑,直接用eval不行,具体的都写在代码的注释里面了。
a = '2 3 4 5 6 7 8 9 10 J Q K'.split()#生成d这个字典让牌和数字一一对应
d = {}
for i in range(len(a)):
d[a[i]] = str(i+2)
d['A'] = '1'
card = input().split()
if 'JOKER' in card or 'joker' in card:#如果有大小王就不往下进行了,直接报错
print('ERROR')
else:
tmp = [] #将四张牌对应的数字写进tmp
for i in range(4):
tmp.append(d[card[i]])
ans = 'NONE'
arr = []
for i in itertools.permutations(tmp):#生成arr,即四个数字的全排列
arr.append(i)
for i in ['+','-','*','/']:#四个数字运算中间总共有三个符号,用ijk来表示,遍历每一种可能
for j in ['+','-','*','/']:
for k in ['+','-','*','/']:
for z in set(arr):
if eval(str(eval(str(eval(z[0]+i+z[1]))+j+z[2]))+k+z[3])== 24:#此处注意不能直接eval整个式子,因为运算过程是按每两个数字从左往右依次进行的,而不会因为乘除优先级高而先进行乘除
ans = z[0]+i+z[1]+j+z[2]+k+z[3]
break
if ans != 'NONE':#ans改变即找到了答案 一路break出去
break
if ans != 'NONE':
break
if ans != 'NONE':
break
if ans != 'NONE':
realans = [0]*4 #real answer 将ans中的数字变成牌
for key,value in d.items():
if value == z[0]:
realans[0] = key
if value == z[1]:
realans[1] = key
if value == z[2]:
realans[2] = key
if value == z[3]:
realans[3] = key
print(realans[0]+i+realans[1]+j+realans[2]+k+realans[3])#最终的表达式
else:
print(ans) #没找到就输出 NONE