move0 = function (input) {
const [stacksRaw, movesRaw] = input.split("\n\n");
const dslRegexp = /move ([?:\d]+) from ([?:\d]+) to ([?:\d]+)/g;
const moves = [...movesRaw.matchAll(dslRegexp)].map((d) =>
d.slice(1).map((n) => parseInt(n))
);
const stacksSplit = stacksRaw.split("\n");
const numberOfStacks = parseInt(
stacksSplit
.slice(-1)[0]
.split(/\s+/g)
.filter((d) => d != "")
.slice(-1)[0]
);
const stacksRegexp = new RegExp(
"(.{3}) ".repeat(numberOfStacks).replace(/.$/, ""),
"gm"
);
var stacks = [...stacksRaw.matchAll(stacksRegexp)]
.map((d) => d.slice(1))
.slice(0, -1);
stacks = stacks[0]
.map((col, idx) => stacks.map((row) => row[idx]))
.map((col) =>
col.filter((d) => d != " ").map((d) => d.replace(/[\[\]]/g, ""))
);
moves.forEach(([nBoxes, fromStack, toStack]) => {
const moved = stacks[fromStack - 1].splice(0, nBoxes);
stacks[toStack - 1].unshift(...moved.reverse());
});
return stacks.map((d) => d[0]).join("");
}