You have a list of numbers L = [17, 5, 9, 17, 59, 14], a dictionary 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.
59*(17-5)-9*17+14 = 569
Limitations and Clarification
- You may not concatinate numbers (
[13,37]may not be used as1337) - Only natural numbers and zero will appear in
L. - The order in
Ldoesn't matter. - You have to use all numbers in
L. - Only the operators +,-,*,/ will appear in
O. Ocan have more operators than you need, but at least|L|-1operators- You may take each operator a number of times equal to its value in
O. - All four operations in
Oare the basic operations you know from math. Especially/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 StackOverflow. I thought it might be an interesting codegolf-challenge.
Computational Complexity
As Peter Taylor said in the comments, you can solve subset sum with this: 1. You have an instance of subset sum (hence a set S of integers and a number x) 2. L := S + [0, ..., 0] (|S| times a zero), N := x, O := {+:|S|-1, *: |S| - 1, /:0, -: 0} 3. Now solve this instance of my problem 4. The solution for subsetsum is the numbers of S that don't get multiplied with zero.
When you would find an Algorithm that is better than O(2^n), you would 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.
Testcases
- ([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
- ([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
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. – boothby Feb 26 at 9:31/≡div), just floating-point and hope-for-no-rounding-errors, ...? – leftaroundabout Feb 26 at 12:025+10+2*3+7*0+0...– Shmiddty Feb 27 at 18:36