adventofcode/2022/09/part1.js

60 lines
1.3 KiB
JavaScript

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);