diff --git a/2022/10/part1.js b/2022/10/part1.js new file mode 100644 index 0000000..531b5a6 --- /dev/null +++ b/2022/10/part1.js @@ -0,0 +1,63 @@ +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 { + 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(); + + return R.pipe( + R.range(0,220), + R.map( () => sys(instructions.shift()) ), + R.map( addSignal ), + R.map( gatherStrength() ), + R.last, + R.prop('strength') + ) + +}; diff --git a/2022/10/part2.js b/2022/10/part2.js new file mode 100644 index 0000000..673e07f --- /dev/null +++ b/2022/10/part2.js @@ -0,0 +1,13 @@ +import * as R from "remeda"; +import { comsys } from './part1.js'; + + +export default (instructions) => { + const sys = comsys(); + + return R.pipe( + R.range(0,3), + R.map( () => sys(instructions.shift()) ), + ) + +}; diff --git a/2022/10/sample b/2022/10/sample new file mode 100644 index 0000000..f428b7b --- /dev/null +++ b/2022/10/sample @@ -0,0 +1,3 @@ +noop +addx 3 +addx -5 diff --git a/2022/10/sample.2 b/2022/10/sample.2 new file mode 100644 index 0000000..37ee8ee --- /dev/null +++ b/2022/10/sample.2 @@ -0,0 +1,146 @@ +addx 15 +addx -11 +addx 6 +addx -3 +addx 5 +addx -1 +addx -8 +addx 13 +addx 4 +noop +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx -35 +addx 1 +addx 24 +addx -19 +addx 1 +addx 16 +addx -11 +noop +noop +addx 21 +addx -15 +noop +noop +addx -3 +addx 9 +addx 1 +addx -3 +addx 8 +addx 1 +addx 5 +noop +noop +noop +noop +noop +addx -36 +noop +addx 1 +addx 7 +noop +noop +noop +addx 2 +addx 6 +noop +noop +noop +noop +noop +addx 1 +noop +noop +addx 7 +addx 1 +noop +addx -13 +addx 13 +addx 7 +noop +addx 1 +addx -33 +noop +noop +noop +addx 2 +noop +noop +noop +addx 8 +noop +addx -1 +addx 2 +addx 1 +noop +addx 17 +addx -9 +addx 1 +addx 1 +addx -3 +addx 11 +noop +noop +addx 1 +noop +addx 1 +noop +noop +addx -13 +addx -19 +addx 1 +addx 3 +addx 26 +addx -30 +addx 12 +addx -1 +addx 3 +addx 1 +noop +noop +noop +addx -9 +addx 18 +addx 1 +addx 2 +noop +noop +addx 9 +noop +noop +noop +addx -1 +addx 2 +addx -37 +addx 1 +addx 3 +noop +addx 15 +addx -21 +addx 22 +addx -6 +addx 1 +noop +addx 2 +addx 1 +noop +addx -10 +noop +noop +addx 20 +addx 1 +addx 2 +addx 2 +addx -6 +addx -11 +noop +noop +noop diff --git a/2022/10/test.js b/2022/10/test.js new file mode 100644 index 0000000..c0cac25 --- /dev/null +++ b/2022/10/test.js @@ -0,0 +1,42 @@ +import { test, expect, describe } from "vitest"; +import * as R from "remeda"; + +import { expectSolution } from "../01/main.js"; +import part1, { comsys, sample, sample2, puzzleInput, addSignal } from "./part1.js"; +import part2 from "./part2.js"; + +describe("part 1", () => { + test( "comsys", () => { + let sys = comsys(); + const result = sample.map( sys).map(R.prop('register')); + + expect(result).toEqual([1,1,4]); + + sys = comsys(); + expect(sample.map( sys ).map(R.prop('cycle')) + + ).toEqual([2,3,4] ) + + }); + test( "signal strength", () => { + expect(addSignal({cycle: 3, register: 2})).toMatchObject({signal: 6}); + + }); + test( "sample2", () => { + + expect(part1(sample2)).toEqual(13140); + + }); + test("solution", () => { + expectSolution(part1(puzzleInput)).toEqual(15020); + }); +}); + +describe.only("part 2", () => { + test("sample", () => { + expectSolution(part2(sample2)).toEqual("TODO"); + }); + test.todo("solution", () => { + expectSolution(part2(puzzleInput)).toEqual("TODO"); + }); +});