2023 - Day 6

This commit is contained in:
2023-12-09 08:38:54 +01:00
parent 9e2016aa06
commit 613492811d
5 changed files with 176 additions and 0 deletions

89
2023/06/PART1.md Normal file
View File

@@ -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?

26
2023/06/PART2.md Normal file
View File

@@ -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?

2
2023/06/input.txt Normal file
View File

@@ -0,0 +1,2 @@
Time: 59 70 78 78
Distance: 430 1218 1213 1276

2
2023/06/sample.txt Normal file
View File

@@ -0,0 +1,2 @@
Time: 7 15 30
Distance: 9 40 200

57
2023/06/solution.ts Normal file
View File

@@ -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