diff --git a/.aocrunner.json b/.aocrunner.json index f79913c..6f31817 100644 --- a/.aocrunner.json +++ b/.aocrunner.json @@ -241,16 +241,18 @@ }, { "part1": { - "solved": false, - "result": null, - "attempts": [], - "time": null + "solved": true, + "result": "4278", + "attempts": [ + "4380" + ], + "time": 218.59 }, "part2": { - "solved": false, - "result": null, + "solved": true, + "result": "1994", "attempts": [], - "time": null + "time": 211.79 } }, { diff --git a/README.md b/README.md index 669eaf6..ba5b07e 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ [![Day](https://badgen.net/badge/14/%E2%98%85%E2%98%85/green)](src/day14) [![Day](https://badgen.net/badge/15/%E2%98%85%E2%98%85/green)](src/day15) [![Day](https://badgen.net/badge/16/%E2%98%85%E2%98%85/green)](src/day16) -![Day](https://badgen.net/badge/17/%E2%98%86%E2%98%86/gray) +[![Day](https://badgen.net/badge/17/%E2%98%85%E2%98%85/green)](src/day17) ![Day](https://badgen.net/badge/18/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/19/%E2%98%86%E2%98%86/gray) ![Day](https://badgen.net/badge/20/%E2%98%86%E2%98%86/gray) @@ -181,9 +181,9 @@ Both parts: 1.4ms ``` Day 17 -Time part 1: - -Time part 2: - -Both parts: - +Time part 1: 218.59ms +Time part 2: 211.79ms +Both parts: 430.38ms ``` ``` @@ -243,8 +243,8 @@ Both parts: - ``` ``` -Total stars: 32/50 -Total time: 1902.9999999999998ms +Total stars: 34/50 +Total time: 2333.3799999999997ms ``` diff --git a/src/day17/README.md b/src/day17/README.md new file mode 100644 index 0000000..17e00fe --- /dev/null +++ b/src/day17/README.md @@ -0,0 +1,9 @@ +# 🎄 Advent of Code 2021 - day 17 🎄 + +## Info + +Task description: [link](https://adventofcode.com/2021/day/17) + +## Notes + +... \ No newline at end of file diff --git a/src/day17/index.js b/src/day17/index.js new file mode 100644 index 0000000..e7b3032 --- /dev/null +++ b/src/day17/index.js @@ -0,0 +1,59 @@ +import run from "aocrunner" + +const parseInput = (rawInput) => { + const [, , a, b, , c, d] = rawInput.trim().split(/[:,] |\.\.|=/) + return [+a, +b, +c, +d] +} + +const part1 = (rawInput, part1 = true) => { + const [minX, maxX, minY, maxY] = parseInput(rawInput) + + function fire(startX, startY) { + let dX = startX, + dY = startY, + x = 0, + y = 0, + highest = 0 + while (x <= maxX && y >= minY) { + x += dX + y += dY + dX -= Math.sign(dX) + dY -= 1 + if (y > highest) { + highest = y + } + if (x >= minX && x <= maxX && y >= minY && y <= maxY) { + return highest + } + } + return undefined + } + + let bestY = 0 + let count = 0 + for (let dy = minY; dy < 1000; dy++) { + for (let dx = 1; dx <= maxX; dx++) { + const newY = fire(dx, dy) + if (newY !== undefined) count++ + if (newY > bestY) bestY = newY + } + } + if (part1) return bestY + return count +} + +const part2 = (rawInput) => { + return part1(rawInput, false) +} + +run({ + part1: { + tests: [{ input: `target area: x=20..30, y=-10..-5`, expected: 45 }], + solution: part1, + }, + part2: { + tests: [{ input: `target area: x=20..30, y=-10..-5`, expected: 112 }], + solution: part2, + }, + trimTestInputs: true, +})