function* ropeSteps(input, ropeLength) {
let segments = Array.from({ length: ropeLength }, (d) => ({ x: 0, y: 0 }));
yield _.cloneDeep(segments);
for (const step of input) {
let [dx, dy] = dirToVec(step.dir);
for (let i = 0; i < step.dist; i++) {
segments[0].x += dx;
segments[0].y += dy;
for (let i = 1; i < segments.length; i++) {
let prev = segments[i - 1];
let cur = segments[i];
let sx = prev.x - cur.x;
let sy = prev.y - cur.y;
if (Math.abs(sx) > 1 || Math.abs(sy) > 1) {
cur.x += Math.sign(sx);
cur.y += Math.sign(sy);
}
}
yield _.cloneDeep(segments);
}
}
}