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,...