RosettaCodeData/Task/Topswops/JavaScript/topswops.js

57 lines
1.5 KiB
JavaScript
Raw Permalink Normal View History

2026-04-30 12:34:36 -04:00
class Topswops {
static maxBest = 32;
static best = new Array(Topswops.maxBest).fill(0);
static trySwaps(deck, f, d, n) {
if (d > this.best[n]) {
this.best[n] = d;
}
for (let i = n - 1; i >= 0; i--) {
if (deck[i] === -1 || deck[i] === i) {
break;
}
if (d + this.best[i] <= this.best[n]) {
return;
}
}
let deck2 = [...deck];
for (let i = 1; i < n; i++) {
const k = 1 << i;
if (deck2[i] === -1) {
if ((f & k) !== 0) {
continue;
}
} else if (deck2[i] !== i) {
continue;
}
deck2[0] = i;
for (let j = i - 1; j >= 0; j--) {
deck2[i - j] = deck[j]; // Reverse copy.
}
this.trySwaps(deck2, f | k, d + 1, n);
}
}
static topswops(n) {
if (n <= 0 || n >= this.maxBest) {
throw new Error("n must be between 1 and maxBest");
}
this.best[n] = 0;
let deck0 = new Array(n + 1).fill(0);
for (let i = 1; i < n; i++) {
deck0[i] = -1;
}
this.trySwaps(deck0, 1, 0, n);
return this.best[n];
}
static main() {
for (let i = 1; i < 11; i++) {
console.log(`${i}: ${this.topswops(i)}`);
}
}
}
// Run the main function
Topswops.main();