62 lines
1.1 KiB
JavaScript
62 lines
1.1 KiB
JavaScript
const nMax = 12;
|
|
|
|
let superperm;
|
|
let pos;
|
|
let count = new Array(nMax);
|
|
|
|
function factSum(n) {
|
|
let sum = 0;
|
|
for (let m = 1; m <= n; m++) {
|
|
let factorial = 1;
|
|
for (let i = 1; i <= m; i++) {
|
|
factorial *= i;
|
|
}
|
|
sum += factorial;
|
|
}
|
|
return sum;
|
|
}
|
|
|
|
function r(n) {
|
|
if (n === 0) {
|
|
return false;
|
|
}
|
|
|
|
const c = superperm[pos - n];
|
|
if (--count[n] === 0) {
|
|
count[n] = n;
|
|
if (!r(n - 1)) {
|
|
return false;
|
|
}
|
|
}
|
|
superperm[pos++] = c;
|
|
return true;
|
|
}
|
|
|
|
function superPerm(n) {
|
|
const chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
|
|
pos = n;
|
|
superperm = new Array(factSum(n));
|
|
|
|
for (let i = 0; i < n + 1; i++) {
|
|
count[i] = i;
|
|
}
|
|
for (let i = 1; i < n + 1; i++) {
|
|
superperm[i - 1] = chars.charAt(i);
|
|
}
|
|
|
|
while (r(n)) {
|
|
// Continue until r(n) returns false
|
|
}
|
|
}
|
|
|
|
function main() {
|
|
for (let n = 0; n < nMax; n++) {
|
|
superPerm(n);
|
|
console.log(`superPerm(${n.toString().padStart(2, ' ')}) len = ${superperm.length}`);
|
|
}
|
|
}
|
|
|
|
// Run the main function
|
|
main();
|