比较繁琐的问题,由于有5秒的运行限制,直接暴力穷举会超时,需要合理剪枝。
先按升序生成所有数字和组合,对每个组合形成的序列,作递归计算:
取出两个数字a,b,分别计算$a+b, a\times b, a-b, b-a, a\div b, b\div a$这六种情况(除法还需排除除数为0的情况)的结果,并放回序列作递归,直到序列长度为1,就检验其是否为24。
枚举所有的取法和计算结果即可。
最终代码行有13行。
代码长度:386字节 vs. 全站第一:166字节。
from itertools import*
e=range
def f(x):
k=len(x)
r=e(k)
if k==1:return abs(x[0]-24)<0.01
for c in combinations(r,2):
a,b=[x[i]for i in r if i in c]
y,z=[x[i]for i in r if i not in c],[[a+b],[a*b],[a-b],[b-a]]
if a:z+=[[b/a]]
if b:z+=[[a/b]]
if any(f(d+y)for d in z):return 1
[f([u,v,w,r])and print(u,v,w,r)for u in e(1,14)for v in e(u,14)for w in e(v,14)for r in e(w,14)]
|