首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为“四四”拼图制作解谜器

为“四四”拼图制作解谜器
EN

Stack Overflow用户
提问于 2014-01-28 03:15:14
回答 2查看 2.1K关注 0票数 3
代码语言:javascript
运行
复制
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', '-.', '/sqrt', '/^',   '/factorial',  '/.', '+sqrt', '+^', '+factorial', '+.', '*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))

这是“四四”难题的求解者的代码。fours

它主要起作用,但如果投入更多的话,它的速度要慢得多。

我想做的是,做一个较小的操作符列表,就像这样。

代码语言:javascript
运行
复制
['-','/','+','*','sqrt','^','factorial',"."]

但是要做到这一点,我需要这样做,这样程序就可以将两个操作符连在一起,这样它就可以得到这样的结果。

代码语言:javascript
运行
复制
4/4+factorial(4)/sqrt(4) = 13

请注意,它们的阶乘在它们+符号之后出现。

我之前询问了如何做到这一点,有人建议我建立相互排斥的列表,这样就可以一个接一个地放置不在相同列表中的操作符。

问题是,如果不彻底重写代码,我似乎无法找到一种有效的方法来实现这一点。

如果有人有一个好的方法来做这件事(或更好的方式完成同样的事情),请告诉我。

另外,我希望这个程序能够把两个四分放在一起,生成44这样的数字,但是这样做给了我很多相同的问题。

例如:当我做0到20,我得到

代码语言:javascript
运行
复制
(4-(4-4))-4 = 0
(4-(4-4))/4 = 1
(4-(4-4))-sqrt(4) = 2
4-((4-sqrt(4))/sqrt(4)) = 3
4-((4-4)/4) = 4
4-((4/4)-sqrt(4)) = 5
4-((4-4)-sqrt(4)) = 6
4-((4/4)-4) = 7
4-((4-4)-4) = 8
4-((4-factorial(4))/4) = 9
(4-(4-4))/(.4) = 10

但是当我用我想要使用的系统时,我得到了

代码语言:javascript
运行
复制
(4-(4-4))-4 = 0
(4-(4-4))/4 = 1
4-((4+4)/4) = 2
(4+4+4)/4 = 3
4-((4-4)/4) = 4
(4+4*4)/4 = 5
(4+4)/4+4 = 6
4-((4/4)-4) = 7
4-((4-4)-4) = 8
4/4+4+4 = 9
Failed: 10

数字10失败是因为它不能将小数点放在除数符号之后,而数字9是不同的,因为阶乘不能放在后面-

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-29 01:56:56

对于更大的目标来说,你的程序花费的时间太长了,因为它做了一些事情,比如尝试取3628804的阶乘。Python会在很长一段时间内讨论这个问题。在以下方面的评估过程中发生的情况:

  • (4)-factorial((4)+阶乘((4)/(.4))
  • =4-因子( 4+factorial( 10 ))
  • =4-阶乘( 3628804 )

如果它能挺过去的话,在那之后还有更难做的事情要做。它不会在你的有生之年结束。

你需要找到一种避免这种计算的方法。避免函数的组合(如阶乘(阶乘(X))可能是足够的。避免这些问题的一个简单方法是编写一个中间函数,例如“easy”,以限制计算一个阶乘的大小。事实将测试这个参数,如果太大会引发异常或返回None,否则调用math.factorial。你会在你的计算公式中调用你的替代的事实函数。

票数 3
EN

Stack Overflow用户

发布于 2022-09-29 21:11:32

这里是使用运算符和括号最简单的四分拼图的源代码。使用阶乘导入数学库。

代码语言:javascript
运行
复制
import math
print ("Zero is", 4+4-4-4)
print ("One is", 4//4+4-4)
print ("One is", 4*4//4//4)
print ("Two is",4-((4+4)//4))
print ("Three is", 44//4-4-4)
print ("Four is", (4//4**4)+4)
print ("Five is",(4+4*4)//4)
print ("Six is", math.factorial(4)//4+4-4)
print ("Seven is", 4+4-4//4)
print ("Eight is", 4*4-4-4)
print ("Nine is", 4+4+4//4)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21396155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档