63 lines
1.4 KiB
JavaScript
63 lines
1.4 KiB
JavaScript
import * as R from "remeda";
|
|
|
|
import { readFile } from "../05/part1.js";
|
|
|
|
const readInput = (...args) =>
|
|
R.pipe(
|
|
readFile(...args),
|
|
(lines) => lines.split("\n"),
|
|
R.compact, // remove last line
|
|
R.map((line) => line.split(" ").map((v, i) => (i ? parseInt(v) : v)))
|
|
);
|
|
|
|
export const puzzleInput = readInput(import.meta.url, "input");
|
|
export const sample = readInput(import.meta.url, "sample");
|
|
export const sample2 = readInput(import.meta.url, "sample.2");
|
|
|
|
export const comsys = () => {
|
|
let cycle = 1;
|
|
let register = 1;
|
|
const scheduled = [];
|
|
|
|
return (instr) => {
|
|
if (instr && instr[0] === "addx") {
|
|
scheduled.push(0, instr[1]);
|
|
} else if (instr) {
|
|
scheduled.push(0);
|
|
}
|
|
cycle++;
|
|
register += scheduled.shift() ?? 0;
|
|
return { cycle, register };
|
|
};
|
|
};
|
|
|
|
export const gatherStrength = () => {
|
|
let strength = 0;
|
|
return ({ cycle, signal, register }) => {
|
|
if ((cycle - 20) % 40 === 0) {
|
|
strength += signal;
|
|
}
|
|
return { strength, cycle, signal, register };
|
|
};
|
|
};
|
|
|
|
export const addSignal = (input) => ({
|
|
...input,
|
|
signal: input.cycle * input.register,
|
|
});
|
|
|
|
export default (instructions) => {
|
|
const sys = comsys();
|
|
|
|
instructions = [...instructions];
|
|
|
|
return R.pipe(
|
|
R.range(0, 220),
|
|
R.map(() => sys(instructions.shift())),
|
|
R.map(addSignal),
|
|
R.map(gatherStrength()),
|
|
R.last,
|
|
R.prop("strength")
|
|
);
|
|
};
|