使用Python创建24点题库和答案库

dgsweb4214年前软件设计与编程521

24点游戏的4个数并不是乱出的,它必须符合一定的条件才能计算得出24,否则题目无解。

本文使用Python编写一个生成24点题库,希望能枚举所有小于某个最大数以内的所有可能解。

代码如下:

# 24 point library creater

ops={'0'}
ops.discard('0')
op = ['+', '-', '*', '/']
for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('A' +op[i] +'B' +op[j] +'C'+ op[k]+ 'D')

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('(A' +op[i] +'B)' +op[j] +'C'+ op[k]+ 'D')

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('A' +op[i] +'(B' +op[j] +'C)'+ op[k]+ 'D')  

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('(A' +op[i] +'B)' +op[j] +'(C'+ op[k]+ 'D)')            

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('(A' +op[i] +'B' +op[j] +'C)'+ op[k]+ 'D')              

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('A' +op[i] +'(B' +op[j] +'C'+ op[k]+ 'D)')


for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('((A' +op[i] +'B)' +op[j] +'C)'+ op[k]+ 'D')
for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('(A' +op[i] +'(B' +op[j] +'C))'+ op[k]+ 'D')

for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('A' +op[i] +'(B' +op[j] +'(C'+ op[k]+ 'D))')
for i in range(0,4):
	for j in range(0,4):
		for k  in range(0,4):
			ops.add('A' +op[i] +'((B' +op[j] +'C)'+ op[k]+ 'D)')			


pos={'0123'}
for i in range(0,4):
	for j in range(0,4):
		if j==i:
			continue
		for k in range(0,4):
			if (k==i) or (k == j):
				continue
			for l in range(0,4):
				if (l==i) or (l==j) or (l==k):
					continue
				pos.add(str(i)+str(j)+str(k)+str(l))
			
opsall={'0'}    
opsall.discard('0') 
Alpha='ABCD'
alpha='abcd'
for ipos in pos:
	for iops in ops:
		s = iops
		for kk in range(0,4):
			s = s.replace(Alpha[kk], alpha[int(ipos[kk])])
			opsall.add(s)   



numlib={''}
numlib.discard('')
reslib={''}
reslib.discard('')
count=0
maxnum = 13
filehandle = open("G:\out.txt", "a")
tcount=maxnum*maxnum*maxnum;
curcnt=0;
for a in range(1,maxnum+1):	
	for b in range(1,maxnum+1):
		for c in range(1,maxnum+1):
			curcnt=curcnt+1;
			r = float(curcnt)*100/tcount;
			print('step ('+str(curcnt) +'/' + str(tcount) +  ', ' + '{:.2f}'.format(r) + '%) '  + str(a)+'.'+str(b)+'.'+str(c))
			for d in range(1,maxnum+1):   
				for itemop in opsall:
					try:
						o=itemop
						if o.find('/')>=0:
							o=o.replace('a', 'AA')
							o=o.replace('b', 'float(b)')
							o=o.replace('c', 'float(c)')
							o=o.replace('d', 'float(d)')
							o=o.replace('AA', 'a')
						res = eval(o)
						if res==24:
							arr=[a,b,c,d]
							arr.sort()
							num = ','.join(str(ii) for ii in arr)							
							s=itemop
							s=s.replace('a', str(a))
							s=s.replace('b', str(b))
							s=s.replace('c', str(c))
							s=s.replace('d', str(d))
							if num not in numlib:
								numlib.add(num)
								xx=num + ';  ' + s + ' = 24'
								reslib.add(xx)
								count=count+1
								line=str(count)+": " + xx + "\n"
								filehandle.write(line)
							break
					except:
						continue
					else:
						continue
print('Found count: ' + str(count))
filehandle.close()
for x in reslib:
    print(x)

比如,当这个最大数为7时,输出结果如下,一共170种组合方式。

Found count: 170

1,3,4,6;  6/(1-3/4) = 24

2,2,5,7;  7*2+5*2 = 24

3,5,6,6;  (3+6-5)*6 = 24

2,2,7,7;  2*(7-2+7) = 24

2,4,4,5;  (5*2-4)*4 = 24

2,3,5,6;  3*2*5-6 = 24

2,2,3,3;  (2+2)*(3+3) = 24

1,2,2,4;  (2*4)*(1+2) = 24

1,2,3,5;  (1+2)*(3+5) = 24

1,4,7,7;  (7-4)*(1+7) = 24

3,3,3,4;  (4+3)*3+3 = 24

2,3,7,7;  (7+7*2)+3 = 24

1,1,6,6;  6*(6-1-1) = 24

5,6,6,6;  6*(5-6/6) = 24

1,1,3,5;  (5+1)*(3+1) = 24

1,1,5,6;  (5-1)*6*1 = 24

1,2,4,6;  (4-1)*(6+2) = 24

3,4,5,7;  (5+7)+4*3 = 24

4,4,4,5;  (4/4+5)*4 = 24

4,7,7,7;  (7-7/7)*4 = 24

1,4,4,4;  (4+1)*4+4 = 24

2,2,3,4;  3*(2*2+4) = 24

4,5,6,6;  (6-5)*6*4 = 24

2,2,6,7;  (7+2)*2+6 = 24

2,2,2,7;  (7*2-2)*2 = 24

5,6,6,7;  (5+6)+(6+7) = 24

1,2,4,5;  4*(5-1+2) = 24

1,4,4,7;  (7*4)*1-4 = 24

1,3,3,7;  (7*3)+(3/1) = 24

3,5,6,7;  3*(7-5+6) = 24

1,3,4,5;  5*4+3+1 = 24

2,4,6,7;  (6+7*2)+4 = 24

1,2,6,6;  (6+6)*(2*1) = 24

1,2,5,7;  (5+7)*(2*1) = 24

3,3,5,6;  (3+3)*5-6 = 24

2,5,6,6;  (5*2-6)*6 = 24

3,5,5,7;  (5/5+7)*3 = 24

3,3,5,5;  5*5-3/3 = 24

1,2,5,5;  (1+5*5)-2 = 24

1,4,5,6;  6/(5/4-1) = 24

3,4,4,7;  (4/4+7)*3 = 24

3,3,5,7;  (3*5-7)*3 = 24

5,5,5,5;  5*5-5/5 = 24

5,6,7,7;  6*(5-7/7) = 24

6,6,6,6;  (6+6)+(6+6) = 24

1,2,2,7;  (2*2)*(7-1) = 24

2,4,6,6;  (6-4)*6*2 = 24

2,2,3,6;  6*(3+2/2) = 24

2,2,4,7;  (7*2)*2-4 = 24

1,1,4,6;  (6/1/1)*4 = 24

4,4,4,7;  (7-4/4)*4 = 24

1,4,4,6;  (6-1)*4+4 = 24

2,3,4,4;  (4*3*4)/2 = 24

4,4,4,4;  (4+4*4)+4 = 24

1,4,6,7;  (1-4+7)*6 = 24

2,3,4,5;  4*(5-2+3) = 24

1,3,5,6;  (1+5)+6*3 = 24

2,4,5,5;  (5+5)*2+4 = 24

1,1,3,4;  (1+1)*(4*3) = 24

2,2,4,4;  (4+2*4)*2 = 24

3,4,5,5;  (5+5*3)+4 = 24

1,3,3,3;  (1+3)*(3+3) = 24

3,3,6,7;  6+(7*3-3) = 24

3,3,4,6;  (6*3*4)/3 = 24

3,6,6,6;  (6+6)/(3/6) = 24

1,4,4,5;  (5*4)+(4/1) = 24

1,4,5,5;  5*4-1+5 = 24

3,5,5,6;  6*(5/5+3) = 24

5,5,5,6;  5*5-6+5 = 24

2,3,4,6;  (2+4)+6*3 = 24

1,2,4,7;  2*(1+4+7) = 24

2,3,6,6;  (2+3)*6-6 = 24

3,6,6,7;  (6/6+7)*3 = 24

2,6,6,6;  (6+6*2)+6 = 24

2,2,4,6;  (6*2*4)/2 = 24

2,2,4,5;  (2*5)*2+4 = 24

1,3,6,6;  6+(6*1*3) = 24

4,4,5,7;  4*(4-5+7) = 24

1,2,4,4;  (1+2)*(4+4) = 24

2,2,3,5;  (5*2-2)*3 = 24

1,2,6,7;  6*(7-1-2) = 24

4,5,5,7;  (7-5/5)*4 = 24

2,2,2,5;  2*(5*2+2) = 24

2,3,4,7;  (7-3)*(2+4) = 24

2,2,3,7;  2*(2+3+7) = 24

2,3,6,7;  (6/2)+(3*7) = 24

1,3,3,6;  3*(6-1+3) = 24

3,3,3,7;  (3/3+7)*3 = 24

3,4,4,6;  (4-3)*6*4 = 24

4,4,4,6;  (6*4*4)/4 = 24

1,2,2,5;  (5+1)*(2+2) = 24

2,4,7,7;  (7+7)*2-4 = 24

3,3,4,5;  (5+3/3)*4 = 24

1,1,5,5;  5*5-1/1 = 24

3,4,5,6;  (3+5-4)*6 = 24

1,3,4,4;  4*(4-1+3) = 24

2,2,5,5;  5*5-2/2 = 24

2,4,4,7;  (7-2)*4+4 = 24

1,1,2,7;  (7+1)*(2+1) = 24

2,3,5,7;  (7+2)+(3*5) = 24

3,3,7,7;  (3+3/7)*7 = 24

2,3,3,7;  3*(7-2+3) = 24

1,3,5,7;  (7-3)*(1+5) = 24

1,5,5,6;  (1+5)*5-6 = 24

4,5,7,7;  (7*5-4)-7 = 24

5,5,6,7;  (5*7)-6-5 = 24

1,2,3,4;  (3*1*2)*4 = 24

2,2,5,6;  (6+5)*2+2 = 24

2,4,5,7;  (5+7)*4/2 = 24

3,3,3,5;  (3*3)+(5*3) = 24

4,5,5,6;  (5*6)/5*4 = 24

2,5,6,7;  (6*2)+5+7 = 24

3,7,7,7;  (3+7)+(7+7) = 24

2,2,2,4;  (2+2)*(2+4) = 24

3,3,6,6;  3*(6+6/3) = 24

4,4,7,7;  7*(4-4/7) = 24

3,6,7,7;  3*(7-6+7) = 24

1,1,4,5;  (5+1)/(1/4) = 24

3,3,3,6;  (3+6*3)+3 = 24

5,5,7,7;  (5+7)+(5+7) = 24

1,5,6,7;  (5*6)+(1-7) = 24

2,3,3,3;  3*(2+3+3) = 24

1,1,2,6;  (2+1+1)*6 = 24

2,3,3,5;  (5+2)*3+3 = 24

1,5,5,5;  5*(5-1/5) = 24

3,3,4,7;  3*(7-3+4) = 24

1,2,3,7;  3*(7-1+2) = 24

4,4,5,5;  4*(5-4+5) = 24

3,4,6,6;  (6+6)+4*3 = 24

1,2,5,6;  2*(1+5+6) = 24

5,5,6,6;  6*(5-6+5) = 24

2,4,5,6;  (2+4)*5-6 = 24

1,3,3,4;  3*(1+3+4) = 24

2,5,7,7;  (7+7)+5*2 = 24

3,3,4,4;  4*3+4*3 = 24

2,4,4,4;  4*(4-2+4) = 24

1,1,5,7;  (1+1)*(5+7) = 24

4,6,7,7;  (4+7)+(6+7) = 24

1,6,6,6;  (6-1)*6-6 = 24

1,1,3,6;  (3+1)/1*6 = 24

1,4,5,7;  (4*7+1)-5 = 24

4,4,5,6;  (5-4)*6*4 = 24

1,5,6,6;  (6*5)*1-6 = 24

1,2,7,7;  (7*7-1)/2 = 24

2,2,6,6;  (6+2)/2*6 = 24

2,4,4,6;  (6+2)+(4*4) = 24

2,2,2,3;  (2*2*2)*3 = 24

1,2,3,6;  (6+2)/(1/3) = 24

1,3,3,5;  (3+5)*(3*1) = 24

2,3,3,6;  6+(3*2*3) = 24

1,2,3,3;  (2*3)*(1+3) = 24

2,3,5,5;  (2+5*5)-3 = 24

4,5,6,7;  4*(5-6+7) = 24

1,2,2,6;  (2*1*2)*6 = 24

2,5,5,7;  (5+7*2)+5 = 24

2,6,6,7;  (6*7+6)/2 = 24

1,3,6,7;  6*3-1+7 = 24

3,4,4,5;  4*(5-3+4) = 24

1,1,4,7;  (4*1)*(7-1) = 24

4,6,6,7;  (7-6/6)*4 = 24

4,5,5,5;  (4+5*5)-5 = 24

3,4,7,7;  (4*7+3)-7 = 24

3,3,3,3;  (3*3)*3-3 = 24

3,4,4,4;  (3+4)*4-4 = 24

1,1,4,4;  (4+1+1)*4 = 24

1,1,3,7;  (7+1)/(1/3) = 24

1,4,6,6;  (1+4)*6-6 = 24

1,3,4,7;  (7*4-1)-3 = 24

1,3,7,7;  (3-7)*(1-7) = 24

4,6,6,6;  (6*4)*6/6 = 24


最大值13以内的题目如下:

24Points13.xlsx


相关文章

STM32单片机嵌入式实战教程

文章摘自我要自学网课程:STM32单片机嵌入式实战教程地址:https://www.51zxw.net/list.aspx?cid=552...

51单片机视频教程

文章摘自我要自学网教程:51单片机视频教程本教程讲解了基础模拟电路和数字电路,以及51单片机的相关应用编程技术。地址:https://www.51zxw.net/list.aspx?cid=473...

C#入门教程

文章摘自我要自学网课程:C#入门教程地址:https://www.51zxw.net/List.aspx?cid=548...

C语言基础入门

文章摘自我要自学网课程:C语言基础入门地址:https://www.51zxw.net/List.aspx?cid=329...

穷举法解决24点计算问题的Python代码

穷举法解决24点计算问题的Python代码

    24点的玩法:    给出4个数字,找到一个正确的加减乘除和括号运算方法,使得结果为24.  ...

使用Python多进程技术计算24点游戏题库

使用Python多进程技术计算24点游戏题库

上一篇文章中,我们使用的穷举法计算了最大数13以下的24点游戏题库。由于使用了单进程单线程的算法方式,计算速度相对较慢。这篇文章,我们使用Python的多进程技术,来计算最大数27以下的24点题库。代...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。