鱼C论坛

 找回密码
 立即注册
查看: 1255|回复: 4

[已解决]24点计算

[复制链接]
发表于 2020-11-20 15:24:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
想做一个24点的计算程序,不知道哪里有错,计算不出答案,麻烦各位大大帮忙看看
如下:
import itertools as itrs
a= [5,5,2,4]
f = []
ops = []
trylist = []
trylist_1 = []
# str = [[a[i],op,a[i],op,a[i],op,a[i]]]


for num_seq in itrs.permutations(a):
    f.append(list(num_seq))
#print (f)

for op in itrs.product(r'+-*/',repeat = 3):
    ops.append(list(op))
#print (ops)


# for each in ops:
#     for i in range (3):
#         ops_list
for formula in itrs.product(ops,f):

    trylist.append(formula)
    for each in trylist:
        each = each[0] + each [1]
        trylist_1.append(each)

formula_1 = []
for each in trylist_1:
    t = each[0]
    each[0] = each[3]
    each[3] = t
    a = each[2]
    each[2] = each[4]
    each[4] = a
    b = each[4]
    each[4] = each[5]
    each[5] = b
for each in trylist_1:
    x = ''
    for each_item in each:
        x += str(each_item)
    formula_1.append(x)
# print(formula_1)
for each in formula_1:
    if eval(each) == 24:
        print(each, ' = 24')
    else:
        print('no solution')
最佳答案
2020-11-20 15:53:52

帮你优化了下代码,你的代码应该进入死循环了:
import itertools as itrs
a= [1,6,4,1]
f = []
ops = []
result = []

for num_seq in itrs.permutations(a):
    f.append(list(num_seq))

for op in itrs.product(r'+-*/',repeat = 3):
    ops.append(list(op))

flag = 0
for formula in itrs.product(ops,f):
    temp = [str(formula[1][0])]
    for each in range(len(formula[0])):
        temp.append(formula[0][each])
        temp.append(str(formula[1][each+1]))
    result.append(' '.join(temp))
for i in set(result):
    if eval(i) == 24:
        print(i, '= 24')
        flag = 1
if flag == 0:
    print('no solution')

输出结果:
4 * 6 * 1 * 1 = 24
1 * 4 / 1 * 6 = 24
6 * 4 * 1 * 1 = 24
6 * 1 * 1 * 4 = 24
4 * 1 / 1 * 6 = 24
1 * 6 * 1 * 4 = 24
6 * 4 / 1 / 1 = 24
4 * 6 / 1 * 1 = 24
6 * 1 * 4 / 1 = 24
6 / 1 * 4 * 1 = 24
4 / 1 * 1 * 6 = 24
6 * 1 / 1 * 4 = 24
4 * 1 * 6 * 1 = 24
4 * 6 - 1 + 1 = 24
4 / 1 / 1 * 6 = 24
6 * 1 * 4 * 1 = 24
4 * 6 * 1 / 1 = 24
4 * 1 * 1 * 6 = 24
4 * 6 / 1 / 1 = 24
6 * 4 + 1 - 1 = 24
6 * 4 - 1 + 1 = 24
1 * 1 * 6 * 4 = 24
1 * 1 * 4 * 6 = 24
6 / 1 / 1 * 4 = 24
6 * 4 * 1 / 1 = 24
4 * 6 + 1 - 1 = 24
1 * 6 / 1 * 4 = 24
1 + 4 * 6 - 1 = 24
1 - 1 + 4 * 6 = 24
4 * 1 * 6 / 1 = 24
1 / 1 * 4 * 6 = 24
1 * 4 * 6 * 1 = 24
1 * 4 * 6 / 1 = 24
1 / 1 * 6 * 4 = 24
6 / 1 * 1 * 4 = 24
1 * 6 * 4 * 1 = 24
1 + 6 * 4 - 1 = 24
1 * 6 * 4 / 1 = 24
1 * 4 * 1 * 6 = 24
4 / 1 * 6 * 1 = 24
1 - 1 + 6 * 4 = 24
6 / 1 * 4 / 1 = 24
4 / 1 * 6 / 1 = 24
6 * 4 / 1 * 1 = 24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-20 15:53:52 | 显示全部楼层    本楼为最佳答案   

帮你优化了下代码,你的代码应该进入死循环了:
import itertools as itrs
a= [1,6,4,1]
f = []
ops = []
result = []

for num_seq in itrs.permutations(a):
    f.append(list(num_seq))

for op in itrs.product(r'+-*/',repeat = 3):
    ops.append(list(op))

flag = 0
for formula in itrs.product(ops,f):
    temp = [str(formula[1][0])]
    for each in range(len(formula[0])):
        temp.append(formula[0][each])
        temp.append(str(formula[1][each+1]))
    result.append(' '.join(temp))
for i in set(result):
    if eval(i) == 24:
        print(i, '= 24')
        flag = 1
if flag == 0:
    print('no solution')

输出结果:
4 * 6 * 1 * 1 = 24
1 * 4 / 1 * 6 = 24
6 * 4 * 1 * 1 = 24
6 * 1 * 1 * 4 = 24
4 * 1 / 1 * 6 = 24
1 * 6 * 1 * 4 = 24
6 * 4 / 1 / 1 = 24
4 * 6 / 1 * 1 = 24
6 * 1 * 4 / 1 = 24
6 / 1 * 4 * 1 = 24
4 / 1 * 1 * 6 = 24
6 * 1 / 1 * 4 = 24
4 * 1 * 6 * 1 = 24
4 * 6 - 1 + 1 = 24
4 / 1 / 1 * 6 = 24
6 * 1 * 4 * 1 = 24
4 * 6 * 1 / 1 = 24
4 * 1 * 1 * 6 = 24
4 * 6 / 1 / 1 = 24
6 * 4 + 1 - 1 = 24
6 * 4 - 1 + 1 = 24
1 * 1 * 6 * 4 = 24
1 * 1 * 4 * 6 = 24
6 / 1 / 1 * 4 = 24
6 * 4 * 1 / 1 = 24
4 * 6 + 1 - 1 = 24
1 * 6 / 1 * 4 = 24
1 + 4 * 6 - 1 = 24
1 - 1 + 4 * 6 = 24
4 * 1 * 6 / 1 = 24
1 / 1 * 4 * 6 = 24
1 * 4 * 6 * 1 = 24
1 * 4 * 6 / 1 = 24
1 / 1 * 6 * 4 = 24
6 / 1 * 1 * 4 = 24
1 * 6 * 4 * 1 = 24
1 + 6 * 4 - 1 = 24
1 * 6 * 4 / 1 = 24
1 * 4 * 1 * 6 = 24
4 / 1 * 6 * 1 = 24
1 - 1 + 6 * 4 = 24
6 / 1 * 4 / 1 = 24
4 / 1 * 6 / 1 = 24
6 * 4 / 1 * 1 = 24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-20 19:06:07 | 显示全部楼层
Twilight6 发表于 2020-11-20 15:53
帮你优化了下代码,你的代码应该进入死循环了:

谢谢您的优化,只是我没找到自己的进入死循环的地方,测试了几次,感觉可能在倒数第二个循环里似的,就是字符串化的那个循环。您能帮忙指导一下么?
另外很感谢您提供的方案,把两个元组合并得很巧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-20 19:14:32 | 显示全部楼层
gonorth 发表于 2020-11-20 19:06
谢谢您的优化,只是我没找到自己的进入死循环的地方,测试了几次,感觉可能在倒数第二个循环里似的,就是 ...



刚刚看了下你代码,并不是死循环,你代码都是用的是 for 循环,也没有对列表进行重复添加

是因为排列后的数据太过庞大,导致结果出现的比较慢

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-21 12:20:03 | 显示全部楼层
Twilight6 发表于 2020-11-20 19:14
刚刚看了下你代码,并不是死循环,你代码都是用的是 for 循环,也没有对列表进行重复添加

是因为 ...

嗯,确实,没有重复覆盖。因为我是每个环节都查一下,看看对不对。谢谢您的帮助。我知道为啥感觉不对了,
最后一个for,我应该改成
for each in list(set(formula_1)):
    if eval(each) == 24:
        print(each, ' = 24')
但是依然发现了一个问题,就是永远不能先算加减再算乘除。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 14:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表