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]) ); export 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"); export const touching = (v1, v2) => [v1.distanceX(v2), v1.distanceY(v2)].every((x) => x * x <= 1); export const moveOnce = (head, tail) => (d) => { head.add(d); if (touching(head, tail)) return tail.toString(); 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); return tail.toString(); }; const moveAround = (directives) => { const head = new Victor(0, 0); const tail = new Victor(0, 0); const move = moveOnce(head, tail); return directives.map(move); }; export default R.createPipe(moveAround, R.uniq, (moves) => moves.length);