Python 24点(2)

Posted on 2020-10-17 21:16  黑炽  阅读(103)  评论(0编辑  收藏  举报
 1 from random import randint
 2 from itertools import permutations
 3 #4个数组和3个运算符可能组成的表达式形式
 4 exps = ('((%s %s %s) %s %s) %s %s',
 5         '(%s %s %s) %s (%s %s %s)',
 6         '(%s %s (%s %s %s) %s %s',
 7         '%s %s ((%s %s %s) %s %s)',
 8         '%s %s (%s %s (%s %s %s))')
 9 ops = '+-*/'
10 
11 def compose_24(v):
12     result = []
13     #函数的嵌套定义
14     def check(exp):
15         try:#有可能会出现除0异常
16             return int(eval(exp)) == 24#计算字符串中有效的表达式,并返回结果
17         except:
18             return False
19     #全排列
20     # permutation()连续返回由 iterable 元素生成长度为 r 的排列
21     #如果 r 未指定或为 None ,r 默认设置为 iterable 的长度,这种情况下,生成所有全长排列。
22     for a in permutations(v):
23         t = [exp % (a[0], op1, a[1], op2, a[2], op3, a[3]) for op1
24              in ops for op2 in ops for op3 in ops for exp in exps if
25              check(exp % (a[0], op1, a[1], op2, a[2], op3, a[3]))]
26         if t:
27             result.append(t)
28     return result
29 
30 card1, card2, card3, card4 = map(int, input('请输入四个扑克牌的大小: ').split(' '))
31 lst = [card1, card2, card3, card4]
32 r = compose_24(lst)
33 if r:
34      print(r)
35 else:
36      print('No answer for ', lst)