2022-12-09 17:28:05 +00:00
|
|
|
import * as R from "remeda";
|
|
|
|
import Victor from "@a-robu/victor";
|
|
|
|
|
|
|
|
import { readFile } from "../05/part1.js";
|
|
|
|
import { passthru } from '../08/part1.js'
|
|
|
|
|
|
|
|
const directions = {
|
|
|
|
R: new Victor(1,0),
|
|
|
|
L: new Victor(-1,0),
|
|
|
|
U: new Victor(0,1),
|
|
|
|
D: new Victor(0,-1),
|
|
|
|
}
|
|
|
|
|
|
|
|
const parseLine = R.createPipe(
|
|
|
|
line => line.split(" "),
|
|
|
|
([direction,times]) => Array(parseInt(times)).fill(directions[direction])
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
const readInput = (...args) => R.pipe(
|
|
|
|
readFile(...args),
|
|
|
|
text => text.split("\n"),
|
|
|
|
R.compact,
|
|
|
|
R.map( parseLine ),
|
|
|
|
R.flatten,
|
|
|
|
)
|
|
|
|
|
|
|
|
export const puzzleInput = readInput(import.meta.url, "input");
|
|
|
|
export const sample = readInput(import.meta.url, "sample");
|
|
|
|
|
|
|
|
const touching = (v1,v2) => [v1.distanceX(v2), v1.distanceY(v2)].every(
|
|
|
|
x => x*x <= 1
|
|
|
|
);
|
|
|
|
|
|
|
|
export function moveOnce( head, tail, d ) {
|
|
|
|
head.add(d);
|
|
|
|
|
2022-12-09 17:33:37 +00:00
|
|
|
if( touching(head,tail) ) return tail.toString();
|
2022-12-09 17:28:05 +00:00
|
|
|
|
|
|
|
const delta = head.clone().subtract(tail).normalize();
|
|
|
|
|
|
|
|
if( delta.x * delta.y ) {
|
|
|
|
delta.x = delta.x > 0 ? 1 : -1;
|
|
|
|
delta.y = delta.y > 0 ? 1 : -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
tail.add(delta);
|
2022-12-09 17:33:37 +00:00
|
|
|
|
|
|
|
return tail.toString();
|
2022-12-09 17:28:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
const moveAround = (directives) => {
|
|
|
|
const head = new Victor(0,0);
|
|
|
|
const tail = new Victor(0,0);
|
|
|
|
|
2022-12-09 17:33:37 +00:00
|
|
|
const move = d => moveOnce(head,tail,d);
|
|
|
|
return [
|
|
|
|
tail.toString(),
|
|
|
|
...directives.map( move )
|
|
|
|
]
|
2022-12-09 17:28:05 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export default R.createPipe(
|
|
|
|
moveAround,
|
|
|
|
R.uniq,
|
2022-12-09 17:33:37 +00:00
|
|
|
moves => moves.length
|
2022-12-09 17:28:05 +00:00
|
|
|
);
|