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
Ldoesn't matter. - You must use all numbers in
L. - Only the operators
+,-,*,/will appear inO. Ocan have more operators than you need, but at least|L|-1operators- You may use each operator any number of times up to the value in
O. - All four operations in
Oare 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\$