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);
}