AdventOfCode/2024/20/20.md

159 lines
4.7 KiB
Markdown

## \-\-- Day 20: Race Condition \-\--
The Historians are quite pixelated again. This time, a massive, black
building looms over you - you\'re [right outside](/2017/day/24) the CPU!
While The Historians get to work, a nearby program sees that you\'re
idle and challenges you to a *race*. Apparently, you\'ve arrived just in
time for the frequently-held *race condition* festival!
The race takes place on a particularly long and twisting code path;
programs compete to see who can finish in the *fewest picoseconds*. The
winner
even gets their very own
[mutex](https://en.wikipedia.org/wiki/Lock_(computer_science))!
They hand you a *map of the racetrack* (your puzzle input). For example:
###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############
The map consists of track (`.`) - including the *start* (`S`) and *end*
(`E`) positions (both of which also count as track) - and *walls* (`#`).
When a program runs through the racetrack, it starts at the start
position. Then, it is allowed to move up, down, left, or right; each
such move takes *1 picosecond*. The goal is to reach the end position as
quickly as possible. In this example racetrack, the fastest time is `84`
picoseconds.
Because there is only a single path from the start to the end and the
programs all go the same speed, the races used to be pretty boring. To
make things more interesting, they introduced a new rule to the races:
programs are allowed to *cheat*.
The rules for cheating are very strict. *Exactly once* during a race, a
program may *disable collision* for up to *2 picoseconds*. This allows
the program to *pass through walls* as if they were regular track. At
the end of the cheat, the program must be back on normal track again;
otherwise, it will receive a [segmentation
fault](https://en.wikipedia.org/wiki/Segmentation_fault)
and get disqualified.
So, a program could complete the course in 72 picoseconds (saving *12
picoseconds*) by cheating for the two moves marked `1` and `2`:
###############
#...#...12....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############
Or, a program could complete the course in 64 picoseconds (saving *20
picoseconds*) by cheating for the two moves marked `1` and `2`:
###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...12..#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############
This cheat saves *38 picoseconds*:
###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..E#...#...#
###.####1##.###
#...###.2.#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############
This cheat saves *64 picoseconds* and takes the program directly to the
end:
###############
#...#...#.....#
#.#.#.#.#.###.#
#S#...#.#.#...#
#######.#.#.###
#######.#.#...#
#######.#.###.#
###..21...#...#
###.#######.###
#...###...#...#
#.#####.#.###.#
#.#...#.#.#...#
#.#.#.#.#.#.###
#...#...#...###
###############
Each cheat has a distinct *start position* (the position where the cheat
is activated, just before the first move that is allowed to go through
walls) and *end position*; cheats are uniquely identified by their start
position and end position.
In this example, the total number of cheats (grouped by the amount of
time they save) are as follows:
- There are 14 cheats that save 2 picoseconds.
- There are 14 cheats that save 4 picoseconds.
- There are 2 cheats that save 6 picoseconds.
- There are 4 cheats that save 8 picoseconds.
- There are 2 cheats that save 10 picoseconds.
- There are 3 cheats that save 12 picoseconds.
- There is one cheat that saves 20 picoseconds.
- There is one cheat that saves 36 picoseconds.
- There is one cheat that saves 38 picoseconds.
- There is one cheat that saves 40 picoseconds.
- There is one cheat that saves 64 picoseconds.
You aren\'t sure what the conditions of the racetrack will be like, so
to give yourself as many options as possible, you\'ll need a list of the
best cheats. *How many cheats would save you at least 100 picoseconds?*
To begin, [get your puzzle input](20/input).
Answer: