系统会为您提供数字列表L = [17, 5, 9, 17, 59, 14]
,一包运算符O = {+:7, -:3, *:5, /:1}
和一个数字N = 569
。
任务
输出一个方程式,该方程式L
的左侧使用所有数字,而右侧使用仅数字N
。如果不可能,则输出False。解决方案示例:
59*(17-5)-9*17+14 = 569
局限和澄清
- 您不能连接数字(
[13,37]
不能用作1337
) - 只会出现自然数和零
L
。 - 顺序
L
无关紧要。 - 您必须使用中的所有数字
L
。 - 只有运营商
+
,-
,*
,/
会出现O
。 O
可以拥有比您所需更多的运算符,但至少|L|-1
运算符- 您最多可以多次使用每个运算符,直到的值
O
。 - 其中的所有四个运算
O
都是标准的数学运算;特别/
是具有精确分数的正态除法。
点数
- 点越少越好
- 代码的每个字符都给你一点
您必须提供易于阅读的非公开版本。
背景
一个类似的问题,有人问堆栈溢出。我认为这可能是一个有趣的代码高尔夫挑战。
计算复杂度
就像彼得·泰勒(Peter Taylor)在评论中说的那样,您可以使用以下方法求解子集和:
- 您有一个子集总和的实例(因此,有一组S和一个整数x)
- L:= S + [0,...,0](| S |乘以零),N:= x,O:= {+:| S | -1,*:| S | -1,/:0,-:0}
- 现在解决这个问题
- 子集总和的解决方案是不将S乘以零的数目。
如果找到比O(2 ^ n)更好的算法,则证明P = NP。由于P vs NP是一个千年奖金问题,因此价值100万美元,因此几乎没有人会找到解决方案。因此,我删除了排名的这一部分。
测试用例
以下不是唯一有效的答案,还存在其他解决方案,并且允许使用以下解决方案:
- (
[17,5,9,17,59,14]
,{+:7, -:3, *:5, /:1}
,569
)
=>59 * (17-5)- 9 * 17 + 14 = 569
- (
[2,2]
,{'+':3, '-':3, '*':3, '/':3}
,1
)
=>2/2 = 1
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,16
)
=>5+10-2*3+7+0+0+0+0+0+0+0 = 16
- (
[2,3,5,7,10,0,0,0,0,0,0,0]
,{'+':20, '-':20, '*':20, '/':20}
,15
)
=>5+10+0*(2+3+7)+0+0+0+0+0+0 = 15
什么样的算法是这样使用-确切小数形式,整数(
—
于
/
≡ div
),只是浮点和希望换无舍入误差,...?
为什么复杂的评分规则会导致计算复杂?子集和有一个简单的减少,因此,比O(2 ^ n)好的任何东西都价值一百万美元。
—
彼得·泰勒
第三个测试用例不是错误的……
—
Shmiddty 2013年
5+10+2*3+7*0+0...
m = |L|
吗 如果是,您如何期望运行时不依赖于该列表的大小?例如,[2,2],[+,+,...,+,/],1
。实际上,由于n为O(m),您可能只用m来写。