array comb proofs
Testing various combination functions.
by bob
HTML
<div id="blockA">Output goes here</div>
CSS
body {
font-family: Verdana, Geneva, sans-serif;
font-size: 12px;
}
JavaScript
//var todo = ["a", "b", "c"];
var todo = [1, 2, 3];
var limit = 3;
// Our handy results printer
function printResults(title, sets){
var block = document.createElement("div");
var out = title + " : " + sets.length + "<br />";
for(i=0; i<sets.length;i++){
out += "[" + sets[i].join(",") + "]<br>";
}
out += "<br><br>";
block.innerHTML = out;
var blockA = document.getElementById("blockA");
blockA.appendChild(block);
}
// ---------------------
// Permutations
// ---------------------
function permutations (src, limit){
limit = limit || 0;
var Asource = src.slice(); // copy the original so we don't apply results to the original.
var combos = [];
var temp = [];
var picker = function (arr, holder, collect) {
if (holder.length) {
collect.push(holder);
}
for (var i=0; i<arr.length; i++) {
var arrcopy = arr.slice(0, arr.length);
var elem = arrcopy.splice(i, 1);
if (arrcopy.length > 0) {
picker(arrcopy, holder.concat(elem), collect);
} else {
collect.push(holder.concat(elem));
}
}
}
picker(Asource, temp, combos);
// Apply the limiter (otherwise, just return "combos");
if(limit < 1){
return combos;
}
// Weed out the items < limit defined
var Aout = [];
for (var i=0; i<combos.length; i++) {
var item = combos[i];
if(item.length <= limit){
Aout.push(item);
}
}
return Aout;
}
var combos = permutations(todo, limit);
printResults("Permutations", combos);
// The following from
// // http://stackoverflow.com/questions/5752002/find-all-possible-subset-combos-in-an-array/21557600#21557600
// ---------------------
// Combinations 1
// ---------------------
var combonations = function(a, min) {
var fn = function(n, src, got, all) {
if (n == 0) {
if (got.length > 0) {
all[all.length] = got;
}
return;
}
for (var j = 0; j < src.length; j++) {
fn(n - 1,...