JSFiddle - React, Tailwind, and code Playground
JavaScript
let input = `R 5
U 8
L 8
D 3
R 17
D 10
L 25
U 20`;
const TAIL_CNT = 9;
let moves = [];
for (const line of input.split("\n")) {
const tmp = line.split(" ");
moves.push([tmp[0], parseInt(tmp[1])]);
}
let hX = 0;
let hY = 0;
let visited = new Set(["0/0"]);
let tails = [];
for (let i = 0; i < TAIL_CNT; i++) {
tails.push([0, 0]);
}
const moveHeadTo = (direction) => {
switch (direction) {
case "U":
hY = hY + 1;
break;
case "D":
hY = hY - 1;
break;
case "L":
hX = hX - 1;
break;
case "R":
hX = hX + 1;
break;
}
for (let i = 0; i < TAIL_CNT; i++) {
moveTail(i);
if (i === TAIL_CNT - 1) {
let [lasttX, lasttY] = tails[TAIL_CNT - 1];
visited.add(`${lasttX}/${lasttY}`);
}
}
};
const moveTail = (i) => {
let [tX, tY] = tails[i];
let refX = 0;
let refY = 0;
if (i > 0) {
let [prevtX, prevtY] = tails[i - 1];
refX = prevtX;
refY = prevtY;
} else {
refX = hX;
refY = hY;
}
let diffX = Math.abs(refX - tX);
let diffY = Math.abs(refY - tY);
if (diffX < 2 && diffY < 2) {
return;
}
if (diffX > 1 && !diffY) {
tX += refX - tX > 0 ? 1 : -1;
} else if (diffY > 1 && !diffX) {
tY += refY - tY > 0 ? 1 : -1;
} else {
tX += refX - tX > 0 ? 1 : -1;
tY += refY - tY > 0 ? 1 : -1;
}
tails[i] = [tX, tY];
};
let i = 0;
for (const [direction, steps] of moves) {
for (let n = 0; n < steps; n++) {
moveHeadTo(direction);
}
i++;
}
console.log(visited.size);