我需要用4个相同的整数进行所有计算。例如。
def all_math(number,goal):
"not sure what to put here yet"
>>print(all_math(3, 6)
3+3+3+3
3+3+3-3#<<Should return this
3+3-3-3
3-3-3-3
((3/3)+3)-3
3*3*3*3
等等。
如何迭代所有这些计算,直到达到给定值(参数goal
)?
答案 0 :(得分:2)
只有两种根本不同的方法来构建具有四个初始值的表达式。您可以将两个值组合成两对,然后组合结果(总共三个操作),或者您可以组合两个,然后结果与第三个,然后结果与最后一个(也是三个操作)。根据您是将每个新的“原始”值放在左侧还是右侧,后者有子案例:((3/3)/3)/3
与3/(3/(3/3))
或3/((3/3)/3)
或{不同{1}}。
然后你必须定义哪些二进制操作是相关的。你已经列出了加法,减法,乘法,除法。还有什么?幂?另一种除法(整数与浮点数)?模? (3/(3/3))/3
?
这是足以完全产生所有可能性的信息(好吧,如果你可以做相关的组合学)。每个模式在运算符中只有三个位置,因此有math.atan2
种可能性5 * N**3
是运算符的数量。我怀疑这是一个愚蠢的数字。
但是,您需要确定“等效”的结果对是否应同时包含在结果中。例如,您要单独列出N
和(3 + 3) * (3 - 3)
吗?那么(3 - 3) * (3 + 3)
和((3 + 3) + 3) + 3)
怎么样?那么(3 + 3) + (3 + 3)
和3+3+3-3
怎么样?如果有必要,在此基础上修剪输出可能非常困难,这取决于您认为等效的内容,并且在问题中没有定义。
您还需要决定是否包含无法评估的表达式,例如3-3+3+3
。识别这些并不困难 - 如果所有其他方法都失败了,只需评估表达式并捕获异常。
最后,根据您所包含的操作的关联性规则,您需要决定是否必须从输出中删除不必要的括号。您的示例输出(3 - 3) / (3 - 3)
表示您愿意,但3+3+3+3
建议您不要。
答案 1 :(得分:0)
这个人应该这样做。如果我忘了一个选项,添加它应该不难:
import itertools
def all_math(n, goal):
operators = ["+" , "-", "*", "/"]
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})",
"{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:
formula = bracket.format(n, *combination)
try:
result = eval(formula)
print formula + " = " + str(result) #for verification
if result == goal:
return bracket.format(int(n), *combination) #to output integer
except ZeroDivisionError:
print formula + " = Zero Division Error"
print "Result:", all_math(3.0, 6)
如果有人对括号有一个很好的算法,我想阅读它。我的版本有点手工制作......
重要提示:使用浮动作为参数(3.0
,而不是3
),否则您遇到了麻烦......