上篇文章已经解决输入例如['1','2','3','4']列表的24点生成方法,那么在现实生活中,我们在玩24点时,抽到牌并不是这一串数字,实际上可能是例如['方片A','梅花A','红桃K','黑桃3']这样四张牌,并且抽到A时,A可以为1或14,那么这样该如何解决呢?
首先思路是将这些牌转化为之前程序里熟悉的列表类型,将’黑桃‘,‘方块’等等删去,然后将J,Q,K转化为11,12,13,而A则转为为一个列表[1,14],我们可以通过笛卡尔乘积的方式,利用itertools中的product函数来实现,将这组数据重新生成一个新的二维列表,那么之后,利用上篇文章的计算函数就能轻松解决了。代码如下:
from itertools import permutations
from itertools import product
operators = ['+','-','*','/']
def add_brace(numbers):
if len(numbers)< 2:return [numbers]
if len(numbers) ==2 :return [['('+str(numbers[0])]+numbers[1:-1]+[str(numbers[1])+')']]
results =[]
for j in range(1,len(numbers)):
prefixs = add_brace(numbers[:j])
tails = add_brace(numbers[j:])
for p in prefixs:
for t in tails:
with_around_brach = ['(' + p[0]] +p[1:] +t[:-1] +[t[-1] +')']
results.append(with_around_brach)
return results
def join_operators_number(operators,with_brace):
finally_exp = with_brace[0]
for i,op in enumerate(operators):
finally_exp += (op + with_brace[i+1])
return finally_exp
def finally_count(cards):
target =24
for i in permutations(cards):
for j in product(operators,repeat = len(cards)-1):
add_brace_number = add_brace(list(i))
for t in add_brace_number:
try:
cc =join_operators_number(j,t)
if eval(cc)==target:print(cc)
except ZeroDivisionError:
continue
---------------------------------------------------------------------------------------
def initial_conversion_function(cards): #新函数
start_list_one=[]
for i in cards:
start_list_one.append(i.replace('梅花','').replace('方片','').replace('红桃','').replace('黑桃','').replace('J','11').replace('Q','12').replace('K','13'))
nn = [i for i,j in enumerate(start_list_one) if j =='A'] #判断A的位置并返回下标值列表
for i in nn: #将'A'替换为列表['1','14']
start_list_one[i]= ['1','14']
list_two =[]
for i in start_list_one: #将字符串转化为数字,因为product函数在处理两位数以上的字符串时,会将字符串拆分处理,而数字则不会
if isinstance(i,list):
list_two.append([int(x) for x in i])
else:
list_two.append([int(i)])
list_three =[]
for i in product(list_two[0],list_two[1],list_two[2],list_two[3]):
slist = [str(k) for k in i]
list_three.append(slist)
return list_three
我们随意带入一组数据试试:
your_cards = ['方片3','梅花A','红桃K','黑桃4']
for i in initial_conversion_function(your_cards):
print('组合{}'.format(i))
finally_count(i)
结果如下:
组合['3', '1', '13', '4']
(3*(13-(1+4)))
(3*((13-1)-4))
(3*(13-(4+1)))
(3*((13-4)-1))
(((3*4)-1)+13)
((3*4)-(1-13))
((3*4)+(13-1))
(((3*4)+13)-1)
(13+((3*4)-1))
((13+(3*4))-1)
((13-1)+(3*4))
(13-(1-(3*4)))
((13-1)+(4*3))
((13-(1+4))*3)
(13-(1-(4*3)))
(((13-1)-4)*3)
(13+((4*3)-1))
((13+(4*3))-1)
((13-(4+1))*3)
(((13-4)-1)*3)
(((4*3)-1)+13)
((4*3)-(1-13))
((4*3)+(13-1))
(((4*3)+13)-1)
组合['3', '14', '13', '4']
组合后面没有结果表明该组合不能计算出24点。
出现多个A时,如下:
your_cards = ['方片3','梅花A','红桃A','黑桃A']
for i in initial_conversion_function(your_cards):
print('组合{}'.format(i))
finally_count(i)
结果如下:
组合['3', '1', '1', '1']
组合['3', '1', '1', '14']
组合['3', '1', '14', '1']
组合['3', '1', '14', '14']
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
((14-(1+3))+14)
(14-(1+(3-14)))
(14-((1+3)-14))
(((14-1)-3)+14)
((14-1)-(3-14))
((14-1)+(14-3))
(((14-1)+14)-3)
(14-((1-14)+3))
(14-(1-(14-3)))
((14-(1-14))-3)
(14+(14-(3+1)))
((14+14)-(3+1))
(14+((14-3)-1))
((14+(14-3))-1)
(((14+14)-3)-1)
(14+(14-(1+3)))
((14+14)-(1+3))
(14+((14-1)-3))
((14+(14-1))-3)
(((14+14)-1)-3)
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
((14-(1+3))+14)
(14-(1+(3-14)))
(14-((1+3)-14))
(((14-1)-3)+14)
((14-1)-(3-14))
((14-1)+(14-3))
(((14-1)+14)-3)
(14-((1-14)+3))
(14-(1-(14-3)))
((14-(1-14))-3)
(14+(14-(3+1)))
((14+14)-(3+1))
(14+((14-3)-1))
((14+(14-3))-1)
(((14+14)-3)-1)
(14+(14-(1+3)))
((14+14)-(1+3))
(14+((14-1)-3))
((14+(14-1))-3)
(((14+14)-1)-3)
组合['3', '14', '1', '1']
组合['3', '14', '1', '14']
((14-(3+1))+14)
(14-(3+(1-14)))
(14-((3+1)-14))
(((14-3)-1)+14)
((14-3)-(1-14))
((14-3)+(14-1))
(((14-3)+14)-1)
(14-((3-14)+1))
(14-(3-(14-1)))
((14-(3-14))-1)
.....
以上就是本文的内容。