第二层循环只进行一次
python吧
全部回复
仅看楼主
level 2
想做一个暴力破解24点的算法,
就是通过循环遍历所有可能产生的组合,
但是第二层循环只进入一次,有没有大神能帮忙解答一下?
2020年02月07日 13点02分 1
level 2
dd
2020年02月07日 13点02分 2
level 2
dd一边顶帖一边水经验真是一件快乐的事情呢
2020年02月07日 13点02分 3
level 14
24点??你是哪个群的[滑稽],等下我也试试
2020年02月07日 14点02分 4
2020年02月07日 14点02分
@雨巷纸伞-迷途 看看我这个版本[阴险]
2020年02月09日 12点02分
@最不过执着 可以啊,我的话估计不管重复反正能算出来就行[阴险]
2020年02月09日 14点02分
@雨巷纸伞-迷途 我之前开机又给改了下,,自己生成数据测试。。我把多余的括号也给处理了[阴险]这是最终版了
2020年02月10日 04点02分
level 1
楼上那个链接代码我看了,,有问题。。。eval支持四则运算的,,所以他那个情况没列举完。。。并且虽说4的三次方,这样代码好写,,但情况列完效率太差了。。所以应该组合 括号和运算符一起考虑,,去掉重复情况,,另外,数字全排列还有重复情况,,不应该做结果多次输出。
2020年02月08日 01点02分 5
level 1
楼上,有问题,当时没怎么想..正重写..我先删了,等下发.
2020年02月09日 11点02分 7
level 1
对于给定的数字,每种固定的运算符最多只有1个符合
因为数字会排列...我不能倒个位置又算一次.
所以要注意 循环顺序.
另,我之前说错了.不存在所谓的后缀,中缀什么的.只要你固定一个计算顺序,
数字和符号都会自己排列去凑.
所以,只存在两种..1.分别先算两头,
2.一头连续先算三个,再加最后一个
---------------------------------------
然后就是去重
此时我得到这,有两个是多余的,我应去掉
2020年02月09日 11点02分 8
level 1
代码这个样子....
我自己测试结果这样.你可以多找数据测试
2020年02月09日 12点02分 9
level 1
from itertools import product
from tools import all_perm
def twenty_four(cards):
save1 = set()
save2 = set()
for ops in product('+-*/', repeat=3):
for nums in all_perm(cards):
exp1 = '({0} {4} {1}) {5} ({2} {6} {3})'.format(*nums, *ops) # (a+b)*(c-d)
exp2 = '(({0}{4}{1}){5}{2}){6}{3}'.format(*nums, *ops) # (a+b)*c-d
try:
if abs(eval(exp1)-24.0) < 1e-10:
if tuple(reversed(ops)) not in save1:
save1.add(ops)
yield exp1
break
elif abs(eval(exp2)-24.0) < 1e-10:
if (ops[1], ops[0], ops[2]) not in save2:
save2.add(ops)
yield exp2
break
except ZeroDivisionError:
continue
r=twenty_four([2,4,5,9])
print(list(r))
=======================================================
那个all_perm()是我自己根据 permutations的算法写的包含重复数字全排列版本...
因为permutation是C实现的,所以不可避免我timeit测时慢些..但需要时,肯定比你再去重快多了.
2020年02月09日 12点02分 10
level 1
2020年02月09日 12点02分 11
level 1
我刚自己又用random写了下测试
基本都符合
至于你昨天问的异常那个,,这都是很基础的用法..这你得自己学习了...
目前这个,已经处理差不多了.重复情况之类的去的很好,,唯一就是多余的括号处理了
2020年02月10日 03点02分 12
level 1
最终版,我把多余的括号 也给去了..
@雨巷纸伞-迷途
2020年02月10日 03点02分 13
level 1
之前这个存在连续两个运算符优先级相同时的重复情况,
例如, 8*9/1/3, 8/1*9/3 这种是相同的...我刚突然运行了下这个,发现的.
当我手贱....再给更正下..
save1 = set() # 会有数字去凑,不能(a+b)*(c-d) 掉个头又来(c-d)*(a+b)
save2 = set() # (a+b)*c+d 和 c*(a+b)+d 重复
# 第一个运算符相同,后两个优先级相同,或者倒过来..重复
# 后两相同时 exp1包含了exp2这种情况;前两相同时,a+b+(c*d)也可以认为exp1包含exp2
2020年02月14日 09点02分 14
1