From 613492811d4961c5231f5cd0657864195b2687f4 Mon Sep 17 00:00:00 2001 From: Bart Riemens Date: Sat, 9 Dec 2023 08:38:54 +0100 Subject: [PATCH] 2023 - Day 6 --- 2023/06/PART1.md | 89 +++++++++++++++++++++++++++++++++++++++++++++ 2023/06/PART2.md | 26 +++++++++++++ 2023/06/input.txt | 2 + 2023/06/sample.txt | 2 + 2023/06/solution.ts | 57 +++++++++++++++++++++++++++++ 5 files changed, 176 insertions(+) create mode 100644 2023/06/PART1.md create mode 100644 2023/06/PART2.md create mode 100644 2023/06/input.txt create mode 100644 2023/06/sample.txt create mode 100644 2023/06/solution.ts diff --git a/2023/06/PART1.md b/2023/06/PART1.md new file mode 100644 index 0000000..a83f79a --- /dev/null +++ b/2023/06/PART1.md @@ -0,0 +1,89 @@ +--- Day 6: Wait For It --- + +The ferry quickly brings you across Island Island. After asking around, you +discover that there is indeed normally a large pile of sand somewhere near here, +but you don't see anything besides lots of water and the small island where the +ferry has docked. + +As you try to figure out what to do next, you notice a poster on a wall near the +ferry dock. "Boat races! Open to the public! Grand prize is an all-expenses-paid +trip to Desert Island!" That must be where the sand comes from! Best of all, the +boat races are starting in just a few minutes. + +You manage to sign up as a competitor in the boat races just in time. The +organizer explains that it's not really a traditional race - instead, you will +get a fixed amount of time during which your boat has to travel as far as it +can, and you win if your boat goes the farthest. + +As part of signing up, you get a sheet of paper (your puzzle input) that lists +the time allowed for each race and also the best distance ever recorded in that +race. To guarantee you win the grand prize, you need to make sure you go farther +in each race than the current record holder. + +The organizer brings you over to the area where the boat races are held. The +boats are much smaller than you expected - they're actually toy boats, each with +a big button on top. Holding down the button charges the boat, and releasing the +button allows the boat to move. Boats move faster if their button was held +longer, but time spent holding the button counts against the total race time. +You can only hold the button at the start of the race, and boats don't move +until the button is released. + +For example: + +``` +Time: 7 15 30 +Distance: 9 40 200 +``` + +This document describes three races: + +- The first race lasts 7 milliseconds. The record distance in this race is 9 + millimeters. +- The second race lasts 15 milliseconds. The record distance in this race is 40 + millimeters. +- The third race lasts 30 milliseconds. The record distance in this race is 200 + millimeters. + +Your toy boat has a starting speed of zero millimeters per millisecond. For each +whole millisecond you spend at the beginning of the race holding down the +button, the boat's speed increases by one millimeter per millisecond. + +So, because the first race lasts 7 milliseconds, you only have a few options: + +- Don't hold the button at all (that is, hold it for 0 milliseconds) at the + start of the race. The boat won't move; it will have traveled 0 millimeters by + the end of the race. +- Hold the button for 1 millisecond at the start of the race. Then, the boat + will travel at a speed of 1 millimeter per millisecond for 6 milliseconds, + reaching a total distance traveled of 6 millimeters. +- Hold the button for 2 milliseconds, giving the boat a speed of 2 millimeters + per millisecond. It will then get 5 milliseconds to move, reaching a total + distance of 10 millimeters. +- Hold the button for 3 milliseconds. After its remaining 4 milliseconds of + travel time, the boat will have gone 12 millimeters. +- Hold the button for 4 milliseconds. After its remaining 3 milliseconds of + travel time, the boat will have gone 12 millimeters. +- Hold the button for 5 milliseconds, causing the boat to travel a total of 10 + millimeters. +- Hold the button for 6 milliseconds, causing the boat to travel a total of 6 + millimeters. +- Hold the button for 7 milliseconds. That's the entire duration of the race. + You never let go of the button. The boat can't move until you let go of the + button. Please make sure you let go of the button so the boat gets to move. 0 + millimeters. Since the current record for this race is 9 millimeters, there + are actually 4 different ways you could win: you could hold the button for 2, + 3, 4, or 5 milliseconds at the start of the race. + +In the second race, you could hold the button for at least 4 milliseconds and at +most 11 milliseconds and beat the record, a total of 8 different ways to win. + +In the third race, you could hold the button for at least 11 milliseconds and no +more than 19 milliseconds and still beat the record, a total of 9 ways you could +win. + +To see how much margin of error you have, determine the number of ways you can +beat the record in each race; in this example, if you multiply these values +together, you get 288 (4 * 8 * 9). + +Determine the number of ways you could beat the record in each race. What do you +get if you multiply these numbers together? diff --git a/2023/06/PART2.md b/2023/06/PART2.md new file mode 100644 index 0000000..04a93dc --- /dev/null +++ b/2023/06/PART2.md @@ -0,0 +1,26 @@ +--- Part Two --- + +As the race is about to start, you realize the piece of paper with race times +and record distances you got earlier actually just has very bad kerning. There's +really only one race - ignore the spaces between the numbers on each line. + +So, the example from before: + +``` +Time: 7 15 30 +Distance: 9 40 200 +``` + +...now instead means this: + +``` +Time: 71530 +Distance: 940200 +``` + +Now, you have to figure out how many ways there are to win this single race. In +this example, the race lasts for 71530 milliseconds and the record distance you +need to beat is 940200 millimeters. You could hold the button anywhere from 14 +to 71516 milliseconds and beat the record, a total of 71503 ways! + +How many ways can you beat the record in this one much longer race? diff --git a/2023/06/input.txt b/2023/06/input.txt new file mode 100644 index 0000000..e5c8984 --- /dev/null +++ b/2023/06/input.txt @@ -0,0 +1,2 @@ +Time: 59 70 78 78 +Distance: 430 1218 1213 1276 diff --git a/2023/06/sample.txt b/2023/06/sample.txt new file mode 100644 index 0000000..28f5ae9 --- /dev/null +++ b/2023/06/sample.txt @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200 diff --git a/2023/06/solution.ts b/2023/06/solution.ts new file mode 100644 index 0000000..e4cc578 --- /dev/null +++ b/2023/06/solution.ts @@ -0,0 +1,57 @@ +const sample = await Deno.readTextFile("sample.txt"); +const input = await Deno.readTextFile("input.txt"); + +const parseInputData1 = (data: string): [number, number][] => { + const lines = data.trim().split("\n").filter(Boolean); + const [times, distances] = lines + .map((line) => + line + .split(/:\ +/)[1] + .split(/\ +/) + .map(Number) + ); + return times.map((time, i) => [time, distances[i]]); +}; + +const solvePart1 = (data: string): number => { + const races = parseInputData1(data); + + return races + .map(([time, distance]) => + Array.from(new Array(time), (_, i) => i).map(( + t, + ) => [distance, t * (time - t)]) + .filter(([distance, total]) => total > distance) + ).map((winingRaces) => winingRaces.length) + .reduce((s, v) => s * v); +}; + +console.log("Sample:", solvePart1(sample)); // 286 +console.log("Input", solvePart1(input)); // 227850 + +const parseInputData2 = (data: string): [number, number] => { + const lines = data.trim().split("\n").filter(Boolean); + const [time, distance] = lines + .map((line) => + Number(line + .split(/:\ +/)[1] + .replace(/\ +/g, '')) + ); + return [time, distance] +}; + + +const solvePart2 = (data: string): number => { + const [time, distance] = parseInputData2(data); + let result = 0; + + for (let t = 0; t < time ; t += 1) { + const total = t * (time - t) + if (total > distance) result++ + } + + return result +} + +console.log("Sample:", solvePart2(sample)); // 71503 +console.log("Input", solvePart2(input)); // 42948149