diff --git a/.aocrunner.json b/.aocrunner.json index d14d301..dbaf706 100644 --- a/.aocrunner.json +++ b/.aocrunner.json @@ -93,16 +93,16 @@ }, { "part1": { - "solved": false, - "result": null, + "solved": true, + "result": "12553187650171", "attempts": [], - "time": null + "time": 21.47319 }, "part2": { - "solved": false, - "result": null, + "solved": true, + "result": "96779702119491", "attempts": [], - "time": null + "time": 782.404856 } }, { diff --git a/README.md b/README.md index 1128509..69b448a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ [![Day](https://badgen.net/badge/04/%E2%98%85%E2%98%85/green)](src/day04) [![Day](https://badgen.net/badge/05/%E2%98%85%E2%98%85/green)](src/day05) [![Day](https://badgen.net/badge/06/%E2%98%85%E2%98%85/green)](src/day06) -![Day](https://badgen.net/badge/07/%E2%98%86%E2%98%86/gray) +[![Day](https://badgen.net/badge/07/%E2%98%85%E2%98%85/green)](src/day07) ![Day](https://badgen.net/badge/08/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/09/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/10/%E2%98%86%E2%98%86/gray) @@ -111,9 +111,9 @@ Both parts: 37138.281ms ``` Day 07 -Time part 1: - -Time part 2: - -Both parts: - +Time part 1: 21.473ms +Time part 2: 782.405ms +Both parts: 803.878ms ``` ``` @@ -243,8 +243,8 @@ Both parts: - ``` ``` -Total stars: 12/50 -Total time: 37460.931ms +Total stars: 14/50 +Total time: 38264.809ms ``` diff --git a/src/day07/README.md b/src/day07/README.md new file mode 100644 index 0000000..e451e17 --- /dev/null +++ b/src/day07/README.md @@ -0,0 +1,9 @@ +# 🎄 Advent of Code 2024 - day 7 🎄 + +## Info + +Task description: [link](https://adventofcode.com/2024/day/7) + +## Notes + +... \ No newline at end of file diff --git a/src/day07/index.ts b/src/day07/index.ts new file mode 100644 index 0000000..1d8957f --- /dev/null +++ b/src/day07/index.ts @@ -0,0 +1,75 @@ +import run from "aocrunner" + +const parseInput = (rawInput: string) => + rawInput.split("\n").map((line) => line.split(/[: ]+/).map(Number)) + +const part1 = (rawInput: string) => { + const input = parseInput(rawInput) + + return input.reduce((total, [target, ...values]) => { + const operators = [(a,b) => a * b, (a,b) => a + b] + const evaluate = (numbers: number[]) => { + if (numbers[0] > target) { + return false + } + if (numbers.length === 1) { + return numbers[0] === target + } + for (const op of operators) { + if (evaluate([op(numbers[0], numbers[1]), ...numbers.slice(2)])) { return true } + } + } + return total + (evaluate(values) ? target : 0) + }, 0) +} + +const part2 = (rawInput: string) => { + const input = parseInput(rawInput) + + return input.reduce((total, [target, ...values]) => { + const operators = [(a,b) => a * b, (a,b) => a + b, (a,b) => Number(`${a}${b}`)] + const evaluate = (numbers: number[]) => { + if (numbers[0] > target) { + return false + } + if (numbers.length === 1) { + return numbers[0] === target + } + for (const op of operators) { + if (evaluate([op(numbers[0], numbers[1]), ...numbers.slice(2)])) { return true } + } + } + return total + (evaluate(values) ? target : 0) + }, 0) +} + +run({ + part1: { + tests: [ + { + input: `190: 10 19 +3267: 81 40 27 +83: 17 5 +156: 15 6 +7290: 6 8 6 15 +161011: 16 10 13 +192: 17 8 14 +21037: 9 7 18 13 +292: 11 6 16 20`, + expected: 3749, + }, + ], + solution: part1, + }, + part2: { + tests: [ + // { + // input: ``, + // expected: "", + // }, + ], + solution: part2, + }, + trimTestInputs: true, + onlyTests: false, +})