Permute Permute

by nwellcome

JavaScript

var quota = [4, 3, 3, 2];
var reviewers = [0, 1, 2, 2, 3, 3];
var reviewerLimits = [2, 2, 2, 2, 2, 2];
var perumtations = permutator(reviewers);
var count = 0;
var problemCount = 0;

for (var i = 0; i < perumtations.length; i++) {
    console.log("[" + i + "]");
    doAssignments(quota, perumtations[i], [2, 2, 2, 2, 2, 2]);
}


function doAssignments(quotas, reviewerOrder, reviewerLimits) {
    for (var i = 0; i < quotas.length; i++) {
        for (var j = 0; j < quotas[i]; j++) {
            console.log("\t[" + i + "] " + reviewerOrder + "\t" + reviewerLimits);
            var limit = reviewerOrder.length + 1;
            var limitReached = false;
            var assignmentFound = false;
            do {
                console.log("\t\t" + limit + "\t" + reviewerOrder + "\t" + reviewerLimits);
                if (reviewerOrder[0] != i && reviewerLimits[0] > 0) {
                    assignmentFound = true;
                    reviewerLimits[0]--;  
                } else {
                    reviewerOrder.push(reviewerOrder.shift());
                    reviewerLimits.push(reviewerLimits.shift());
                    limit--;
                    if (limit == 0) {
                        limitReached = true;
                        problemCount++;
                        console.log("!!!!! PROBLEM !!!!!");
                    }
                }                
            } while (!limitReached && !assignmentFound)
        }
    }
    count++;
    console.log(reviewerOrder + "\t" + problemCount + "/" + count);
}

function permutator(input) {
  var set =[];
  function permute (arr, data) {
    var cur, memo = data || [];

    for (var i = 0; i < arr.length; i++) {
       cur = arr.splice(i, 1)[0];
       if (arr.length === 0) set.push(memo.concat([cur]));
       permute(arr.slice(), memo.concat([cur]));
       arr.splice(i, 0, cur);
    }
    return set;
 }
 return permute(input);
}