diff --git a/2022/10/input b/2022/10/input new file mode 100644 index 0000000..4be34cb --- /dev/null +++ b/2022/10/input @@ -0,0 +1,144 @@ +addx 1 +addx 4 +addx 1 +noop +addx 4 +addx 3 +addx -2 +addx 5 +addx -1 +noop +addx 3 +noop +addx 7 +addx -1 +addx 1 +noop +addx 6 +addx -1 +addx 5 +noop +noop +noop +addx -37 +addx 7 +noop +noop +noop +addx 5 +noop +noop +noop +addx 9 +addx -8 +addx 2 +addx 5 +addx 2 +addx 5 +noop +noop +addx -2 +noop +addx 3 +addx 2 +noop +addx 3 +addx 2 +noop +addx 3 +addx -36 +noop +addx 26 +addx -21 +noop +noop +noop +addx 3 +addx 5 +addx 2 +addx -4 +noop +addx 9 +addx 5 +noop +noop +noop +addx -6 +addx 7 +addx 2 +noop +addx 3 +addx 2 +addx 5 +addx -39 +addx 34 +addx 5 +addx -35 +noop +addx 26 +addx -21 +addx 5 +addx 2 +addx 2 +noop +addx 3 +addx 12 +addx -7 +noop +noop +noop +noop +noop +addx 5 +addx 2 +addx 3 +noop +noop +noop +noop +addx -37 +addx 21 +addx -14 +addx 16 +addx -11 +noop +addx -2 +addx 3 +addx 2 +addx 5 +addx 2 +addx -15 +addx 6 +addx 12 +addx -2 +addx 9 +addx -6 +addx 7 +addx 2 +noop +noop +noop +addx -33 +addx 1 +noop +addx 2 +addx 13 +addx 15 +addx -21 +addx 21 +addx -15 +noop +noop +addx 4 +addx 1 +noop +addx 4 +addx 8 +addx 6 +addx -11 +addx 5 +addx 2 +addx -35 +addx -1 +noop +noop 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/puzzle.md b/2022/10/puzzle.md new file mode 100644 index 0000000..683f762 --- /dev/null +++ b/2022/10/puzzle.md @@ -0,0 +1,207 @@ +\--- Day 10: Cathode-Ray Tube --- +---------- + +You avoid the ropes, plunge into the river, and swim to shore. + +The Elves yell something about meeting back up with them upriver, but the river is too loud to tell exactly what they're saying. They finish crossing the bridge and disappear from view. + +Situations like this must be why the Elves prioritized getting the communication system on your handheld device working. You pull it out of your pack, but the amount of water slowly draining from a big crack in its screen tells you it probably won't be of much immediate use. + +*Unless*, that is, you can design a replacement for the device's video system! It seems to be some kind of [cathode-ray tube](https://en.wikipedia.org/wiki/Cathode-ray_tube) screen and simple CPU that are both driven by a precise *clock circuit*. The clock circuit ticks at a constant rate; each tick is called a *cycle*. + +Start by figuring out the signal being sent by the CPU. The CPU has a single register, `X`, which starts with the value `1`. It supports only two instructions: + +* `addx V` takes *two cycles* to complete. *After* two cycles, the `X` register is increased by the value `V`. (`V` can be negative.) +* `noop` takes *one cycle* to complete. It has no other effect. + +The CPU uses these instructions in a program (your puzzle input) to, somehow, tell the screen what to draw. + +Consider the following small program: + +``` +noop +addx 3 +addx -5 + +``` + +Execution of this program proceeds as follows: + +* At the start of the first cycle, the `noop` instruction begins execution. During the first cycle, `X` is `1`. After the first cycle, the `noop` instruction finishes execution, doing nothing. +* At the start of the second cycle, the `addx 3` instruction begins execution. During the second cycle, `X` is still `1`. +* During the third cycle, `X` is still `1`. After the third cycle, the `addx 3` instruction finishes execution, setting `X` to `4`. +* At the start of the fourth cycle, the `addx -5` instruction begins execution. During the fourth cycle, `X` is still `4`. +* During the fifth cycle, `X` is still `4`. After the fifth cycle, the `addx -5` instruction finishes execution, setting `X` to `-1`. + +Maybe you can learn something by looking at the value of the `X` register throughout execution. For now, consider the *signal strength* (the cycle number multiplied by the value of the `X` register) *during* the 20th cycle and every 40 cycles after that (that is, during the 20th, 60th, 100th, 140th, 180th, and 220th cycles). + +For example, consider this larger program: + +``` +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 + +``` + +The interesting signal strengths can be determined as follows: + +* During the 20th cycle, register `X` has the value `21`, so the signal strength is 20 \* 21 = *420*. (The 20th cycle occurs in the middle of the second `addx -1`, so the value of register `X` is the starting value, `1`, plus all of the other `addx` values up to that point: 1 + 15 - 11 + 6 - 3 + 5 - 1 - 8 + 13 + 4 = 21.) +* During the 60th cycle, register `X` has the value `19`, so the signal strength is 60 \* 19 = `*1140*`. +* During the 100th cycle, register `X` has the value `18`, so the signal strength is 100 \* 18 = `*1800*`. +* During the 140th cycle, register `X` has the value `21`, so the signal strength is 140 \* 21 = `*2940*`. +* During the 180th cycle, register `X` has the value `16`, so the signal strength is 180 \* 16 = `*2880*`. +* During the 220th cycle, register `X` has the value `18`, so the signal strength is 220 \* 18 = `*3960*`. + +The sum of these signal strengths is `*13140*`. + +Find the signal strength during the 20th, 60th, 100th, 140th, 180th, and 220th cycles. *What is the sum of these six signal strengths?* + +To begin, [get your puzzle input](10/input). + +Answer: + +You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Cathode%2DRay+Tube%22+%2D+Day+10+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F10&related=ericwastl&hashtags=AdventOfCode) [Mastodon](javascript:void(0);)] this puzzle. \ No newline at end of file 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"); + }); +});