Created
April 17, 2015 23:03
-
-
Save YanivHaramati/9657def74165839cbbb1 to your computer and use it in GitHub Desktop.
find a subset that adds up to a number over a verrrrry long list
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function ArrayAddition(arr, expectedSum) { | |
// get all subsets, and filter out subsets whose sum doesn't add up to expectedSum. | |
var sizeRange = range(arr.length); | |
for (var i = 0; i < sizeRange.length; i++){ | |
var subs = subsets(arr, sizeRange[i]).filter(function(s){ return s.length > 0;}); | |
for(var j = 0; j < subs.length; j++){ | |
if (sum(subs[j]) === expectedSum) { | |
return subs[j]; | |
} | |
} | |
} | |
} | |
// sum all numbers in an array | |
function sum(arr) { | |
return arr.reduce(function(p,c) { | |
return p+c; | |
}, 0); | |
} | |
function range(min, max) { | |
if (!max) { | |
max = min; | |
min = 1; | |
} | |
return Array.apply(null, Array(max)).map(function(_,i){ return i+min; }); | |
} | |
// I stole this bit of magic from stack overflow. | |
// Quite clever. | |
var subsets = function(input, size){ | |
var results = [], result, mask, total = Math.pow(2, input.length); | |
for(mask = 0; mask < total; mask++){ | |
result = []; | |
var i = input.length - 1; | |
do{ | |
if( (mask & (1 << i)) !== 0){ | |
result.push(input[i]); | |
} | |
}while(i--); | |
if( result.length >= size){ | |
results.push(result); | |
} | |
} | |
return results; | |
}; | |
var numbers = [-6000.00,-3740.33,-3600.00,-3600.00,-2400.00,-2400.00,-2000.00,-848.61,-761.30,-712.20,-688.13,-585.66,-528.08,-501.05,-466.56,-452.59,-452.59,-343.52,-339.44,-282.90,-282.90,-282.87,-280.51,-239.51,-235.85,-233.98,-224.41,-200.42,-178.19,-172.10,-170.98,-169.86,-167.02,-165.69,-158.27,-150.86,-149.61,-145.87,-144.65,-141.24,-113.15,-110.81,-108.91,-101.51,-93.39,-83.90,-74.91,-72.93,-70.78,-70.40,-68.11,-67.67,-57.92,-37.19,-36.87,-32.94,-32.00,-28.60,-27.24,-17.49,-16.74,-15.90,-13.54,-9.87,-7.74,-5.52,-0.18,0.18,9.87,13.54,15.90,27.24,28.60,37.19,57.92,67.67,68.11,70.40,70.78,72.93,74.91,93.39,101.51,108.91,113.15,144.65,145.87,150.86,167.02,169.86,170.98,172.10,178.19,200.42,239.51,247.78,247.78,253.84,253.84,253.84,253.84,253.84,253.84,282.87,282.90,282.90,307.88,339.44,452.59,452.59,466.56,501.05,509.21,528.08,585.66,688.13,719.23,761.30,831.05,848.61,1168.95,1452.97,2400.00,2400.00,3600.00,3600.00,3740.33,6000.00,-113.15,-110.81,-108.91,-101.51,-93.39,-83.90,-74.91,-72.93,-70.78,-70.40,-68.11,-67.67,-57.92,-37.19,-36.87,-32.94,-32.00,-28.60,-27.24,-17.49,-16.74,-15.90,-13.54,-9.87,-7.74,-5.52,-0.18,0.18,9.87,13.54,15.90,27.24,28.60,37.19,57.92,67.67,68.11,70.40,70.78,72.93,74.91,93.39,101.51,108.91,113.15,144.65,145.87,150.86,167.02,169.86,170.98,172.10,178.19,200.42,239.51,247.78,247.78,253.84,253.84,253.84,253.84,253.84,253.84,282.87,282.90,282.90,307.88,339.44,452.59,452.59,466.56,501.05,509.21,528.08,585.66,688.13,719.23,761.30,831.05,848.61,1168.95,1452.97,2400.00,2400.00,3600.00,3600.00,3740.33,6000.00]; | |
// var numbers = [1.0, 2.23, 3.45,4.85,5.02,6.00,7.98,8.0,9.0,10.00] | |
var expectedValue = 275.40; | |
//var expectedValue = 2.23+3.45+4.85+6; | |
console.log(ArrayAddition(numbers, expectedValue)); | |
console.log(ArrayAddition(numbers, -1 * expectedValue)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment