|
function pairwise(arr, arg) { |
|
var usedIndexes = []; |
|
var usedIndexesMultiple = []; |
|
var indexPairs = []; |
|
var sum = 0; |
|
if (arr.length <= 1){return 0;}else{ |
|
// find all possible pairs |
|
arr.reduce(function(previousValue, currentValue, currentIndex, array){ |
|
for (var p=0;p<array.length;p++){ |
|
if (p != currentIndex){ |
|
if (currentValue + array[p] == arg){ |
|
indexPairs.push([currentIndex,p]); |
|
} |
|
} |
|
} |
|
}); |
|
// filter found pairs |
|
for (var k=0;k<indexPairs.length;k++){ |
|
usedIndexes = []; |
|
for (var x=0;x<indexPairs.length;x++){ |
|
if (x < indexPairs.length-1){ |
|
filter(indexPairs, k, x); |
|
}else{ |
|
usedIndexesMultiple.push(filter(indexPairs, k, x)); |
|
} |
|
} |
|
} |
|
// find min sum, if there is more than one valid indexes combination |
|
for (var c=0;c<usedIndexesMultiple.length;c++){ |
|
if (usedIndexesMultiple[c].length == usedIndexes.length){ |
|
var sm1 = usedIndexesMultiple[c].reduce(function(previousValue, currentValue, currentIndex, array){return previousValue + currentValue;}); |
|
var sm2 = usedIndexes.reduce(function(previousValue, currentValue, currentIndex, array){return previousValue + currentValue;}); |
|
if (sm1 < sm2){ |
|
sum = sm1; |
|
usedIndexes = usedIndexesMultiple[c]; |
|
}else{ |
|
sum = sm2; |
|
} |
|
} |
|
} |
|
//return JSON.stringify(usedIndexesMultiple); |
|
//return JSON.stringify(usedIndexes); |
|
return sum; |
|
} |
|
function filter(indexPairs, k, x){ |
|
if (usedIndexes.length < 2){ |
|
usedIndexes.push(indexPairs[x][0]); |
|
usedIndexes.push(indexPairs[x][1]); |
|
//sum += indexPairs[k][0] + indexPairs[k][1]; |
|
}else{ |
|
if (usedIndexes.indexOf(indexPairs[k][0]) == -1 && usedIndexes.indexOf(indexPairs[k][1]) == -1){ |
|
usedIndexes.push(indexPairs[k][0]); |
|
usedIndexes.push(indexPairs[k][1]); |
|
//sum += indexPairs[k][0] + indexPairs[k][1]; |
|
} |
|
} |
|
return usedIndexes; |
|
} |
|
} |
|
//pairwise([1,4,2,3,0,5], 7); |
|
//pairwise([1, 3, 2, 4], 4); |
|
pairwise([1, 1, 1], 2); |
|
//pairwise([0, 0, 0, 0, 1, 1], 1); |
|
//pairwise([], 100); |