Skip to content

Instantly share code, notes, and snippets.

@rfprod
Last active April 22, 2017 15:53
Show Gist options
  • Save rfprod/ebde5b4cc8751140cda8 to your computer and use it in GitHub Desktop.
Save rfprod/ebde5b4cc8751140cda8 to your computer and use it in GitHub Desktop.
Pairwise
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);

Pairwise

Function returns the sum of all indexes of elements of 'arr' that can be paired with one other element to form a sum that equals the value in the second argument 'arg'. If multiple sums are possible, function returns the smallest sum. Once an element has been used, it cannot be reused to pair with another.

A script by V.

License.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment