我创建的数据格式如下:
initial_data = [
"518-2", '533-3', '534-0',
'000-3', '000-4']
我需要对连字符之前的部分执行几个运算(add、sub、div、mult、factorial、power_to、root),以查看是否存在等于连字符之后的部分的等式。
就像这样:
#5182
-5 - 1 + 8 = 2 or 5*(-1) - 1 + 8 = 2
#000-3
number, solution, number_of_solutions
000-3,(0! + 0!) + 0! = 3,2
or
000-4,,0
or
533-3,5 - (3! / 3) = 3,5
连字符之前的每个数字都可以有相反的符号,所以我发现了这个:
def inverter(data):
inverted_data = [-x for x in data]
res = list(product(*zip(data, inverted_data)))
return res
我应该创建一个CSV文件,就像上面的例子一样,但是我还没有到那个部分,这似乎是最简单的部分。我有几个不同的部分,我不能以一种明智的方式连接:
import numpy as np
from itertools import product
from math import factorial
def plus(a, b):
return a + b
def minus(a, b):
return a - b
def mult(a, b):
return a * b
def div(a, b):
if b!=0:
if a%b==0:
return a//b
return np.nan
def the_factorial(a, b):
try:
return factorial(int(a))
except ValueError:
return np.nan
def power_to(a:int, b:int)->int:
try:
return int(a**b)
except ValueError:
return np.nan
def root(a:int, b:int)->int:
try:
return int(b**(1 / a))
except (TypeError, ZeroDivisionError, ValueError):
return np.nan
def combinations(nums, funcs):
"""Both arguments are lists"""
t = []
for i in range(len(nums)-1):
t.append(nums)
t.append(funcs)
t.append(nums)
return list(itertools.product(*t))
def solve(instance):
instance = list(instance)
for i in range(len(instance)//2):
b = instance.pop()
func = instance.pop()
a = instance.pop()
instance.append(func(a, b))
return instance[0]
def main():
try:
# a = [1, 3 ,4]
a = [int(-5), int(-1), int(8)]
func = [plus, minus, mult, div, the_factorial, power_to, root]
combs = combinations(a, func)
solutions = [solve(i) for i in combs]
for i, j in zip(combs, solutions):
print(i, j)
except ValueError:
#If there's too many combinations
return np.nan
我在将数据从initial_data转换到inverter再转换到main时遇到了麻烦,目前这只适用于一个示例,并返回了一个中间带有函数对象的难看的读数。
先谢谢你。
1条答案
按热度按时间mpbci0fu1#
我认为这会对你有很大的帮助(调整是你),但它没有写在CSV,我留给你去尝试,只是考虑到有成千上万的可能组合,在某些情况下,结果真的很大(见
main()
中的评论)。我在函数声明中添加了缺少的类型,以便清晰和成功linting(与旧的Python版本兼容)。此外,我认为不需要函数
combinations()
,所以我删除了它。在我提出的代码中,函数solve()
是一个很有魔力的函数:)下面是完整的代码:
对于输出,请注意,解是使用函数名而不是数学运算符来打印/格式化的。这只是
initial_data
中第一个值的输出摘录,其中第一位和第三位使用阶乘:请注意,4608个案例仅针对
initial_data
中的第一个值进行了处理,因此我建议您先尝试使用此案例,然后再添加其余案例,因为对于某些案例,这可能会花费大量处理时间。另外,我注意到您截断了
div()
和root()
中的值,所以请记住这一点。您将在完整输出中看到大量的nan
和inf
,因为有大量的值和条件,如div/0
,所以这是意料之中的。