You are given a list of numbers L = [17, 5, 9, 17, 59, 14]
, a bag of operators O = {+:7, -:3, *:5, /:1}
and a number N = 569
.
Task
Output an equation that uses all numbers in L
on the left-hand side and only the number N
on the right-hand side. If this is not possible, output False. Example solution:
59*(17-5)-9*17+14 = 569
Limitations and Clarification
- You may not concatenate numbers (
[13,37]
may not be used as1337
) - Only natural numbers and zero will appear in
L
. - The order in
L
doesn't matter. - You must use all numbers in
L
. - Only the operators
+
,-
,*
,/
will appear inO
. O
can have more operators than you need, but at least|L|-1
operators- You may use each operator any number of times up to the value in
O
. - All four operations in
O
are the standard mathematical operations; in particular,/
is normal division with exact fractions.
Points
- The less points, the better
- Every character of your code gives you one point
You have to provide an un-golfed version that is easy to read.
Background
A similar question was asked on Stack Overflow. I thought it might be an interesting code-golf challenge.
Computational Complexity
As Peter Taylor said in the comments, you can solve subset sum with this:
- You have an instance of subset sum (hence a set S of integers and a number x)
- L := S + [0, ..., 0] (|S| times a zero), N := x, O := {+:|S|-1, *: |S| - 1, /:0, -: 0}
- Now solve this instance of my problem
- The solution for subset sum is the numbers of S that don't get multiplied with zero.
If you find an Algorithm that is better than O(2^n), you prove that P=NP. As P vs NP is a Millennium Prize Problem and hence worth 1,000,000 US-Dollar, it is very unlikely that somebody finds a solution for this. So I removed this part of the ranking.
Test cases
The following are not the only valid answers, other solutions exist, and are permitted:
- (
[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
m = |L|
? If yes, how can you expect the runtime to not depend on the size of that list? For example,[2,2],[+,+,...,+,/],1
. In fact, since n is O(m), you might just write it all in terms of m. \$\endgroup\$/
≡div
), just floating-point and hope-for-no-rounding-errors, ...? \$\endgroup\$5+10+2*3+7*0+0...
\$\endgroup\$