Python 改进a";四个四“;解谜者

Python 改进a";四个四“;解谜者,python,math,iteration,itertools,Python,Math,Iteration,Itertools,以下是“四四”问题求解器的代码 谜题 它基本上可以工作,但问题是它只能使用+-/*操作符,因为它不能有两个操作符在一行(像这样的解决方案(4-4)/4+阶乘(4)是不允许的,因为这是“+阶乘”部分)。我能做的(但会变慢)是这样进行配对。 ['-'、'/'、'+'、'*'、'-sqrt'、'-^'、'-factorial'、'-sqrt'、'/sqrt'、'/factorial'、'/.'、'+sqrt'、'+^'、'+factorial'、'+sqrt'、'-sqrt'、'-^',factori

以下是“四四”问题求解器的代码 谜题

它基本上可以工作,但问题是它只能使用+-/*操作符,因为它不能有两个操作符在一行(像这样的解决方案(4-4)/4+阶乘(4)是不允许的,因为这是“+阶乘”部分)。我能做的(但会变慢)是这样进行配对。 ['-'、'/'、'+'、'*'、'-sqrt'、'-^'、'-factorial'、'-sqrt'、'/sqrt'、'/factorial'、'/.'、'+sqrt'、'+^'、'+factorial'、'+sqrt'、'-sqrt'、'-^',factorial'、'.]

这是太多的运营商

我想做的是,尝试一下这样的东西

import itertools
import math
import time
from time import time
from math import factorial
from math import sqrt


def pretty(string):
    string=string.replace("(4)","4")
    string=string.replace("factorial4","factorial(4)")
    string=string.replace("sqrt4","sqrt(4)")
    return string


def test(n):
start=time()
fails=0
for i in range(0,n+1):
    if(fours(i))!=None:
        print(fours(i))
    else:
        print("Failed: "+str(i))
        fails+=1
return("\nFailed "+str(fails)+" out of "+str(n)+"\n\nTotal time: "+str(time()-start)[:4]+"\nAverage time: "+str((time()-start)/n)[:4])

def fours(goal):
    operators = ['-','/','+','*','sqrt','^','factorial',"."]
    brackets = ["{0}{1}{0}{2}{0}{3}{0}",
                "({0}{1}{0}){2}{0}{3}{0}",
                "({0}{1}{0}{2}{0}){3}{0}",
                "({0}{1}({0}{2}{0})){3}{0}",
                "(({0}{1}{0}){2}{0}){3}{0}",
                "{0}{1}({0}{2}({0}{3}{0}))",
                "{0}{1}(({0}{2}{0}){3}{0})",
                "({0}{1}{0}){2}({0}{3}{0})"]
    for combination in itertools.product(operators, repeat=3):
        for bracket in brackets:
            try:
                formula = bracket.format("(4)", *combination).replace(".(4","(.4")
            except ValueError:
                pass
            try:
                if eval(formula)==goal:
                    return(pretty((formula + " = " + str(int(eval(formula))))))
            except:
                pass

print(test(20))
除非此语法无效

我该怎么做


或者,如果你们有更好的想法(我相信你们中的一些人也有),我愿意接受建议。

你们可以尝试将其转换为预修复或后期修复。您可以允许它在任何时候使用['!'、'sqrt'、'.'.]命令。'^'仅当至少有一个四个仍然可以在堆栈上推送时才使用。和['+'、'-'、'/'、'*']只有在运算符多于数字(或类似数字)时才会被推送。

将运算符分隔为相互排斥的列表。基本上,不能一个接一个使用的任何两个操作符都将在同一个列表中。类似于
['-'、'+'、'/'、'*']、['sqrt'、'']。。。['-'''],['.',']
。然后,您可以对它进行强制操作,将每个列表中的一个应用于每个术语(确保可选运算符是可选的)。请注意顺序,您不希望任何结果出现语法错误。
formula = bracket.format(["(4)","(4*)","(4-)","(4/)"], *combination).replace(".(4","(.4")