2023 Day 16 Complete!
This commit is contained in:
parent
5769c7e75c
commit
a34f05d1af
110
2023/day16/input
Normal file
110
2023/day16/input
Normal file
@ -0,0 +1,110 @@
|
||||
\..|...................|........\..............\.................-......./........./...\..........-......./...
|
||||
........../...-/......\.|............../.................\...........\........-.........|.....\.-.|...........
|
||||
...............-...........|......|...|......../.......\............../.................................../...
|
||||
..................................|............../..|.|.../............./..\\........|...|..............\..|..
|
||||
...........................-...-...-.......................-.....-.-....\.......-............................/
|
||||
........-...|.......|./../......................./.........................\.................../.....\........
|
||||
\..\............-.\.........|../................................\....\......................./.............-..
|
||||
|\...|....\................\...|........\-..............|............\.........\.\..|.|.......................
|
||||
.....\.........\......|...-...............................-.............-../.../..--......\.....\.............
|
||||
................|...........................|..........\...........././.................../............../....
|
||||
.............................\......\.../..|................---................-......\....|...-............-.
|
||||
..........|........./......\|...|.......|........\......\....-....\...-...../................/..-..../......-.
|
||||
...|............./.................\../....|...\../.................|...|..|......|...........................
|
||||
..................................-......../.....|............................................................
|
||||
...................-.............|...-.........../...........................-..............-...............|.
|
||||
..-.............../.............................-......-.....-.............|-...../....................../....
|
||||
....||...../.........................................-...........................................--./-.......\
|
||||
...................\..........-......./..............|\........................../.-.|..............-..-/...|.
|
||||
.-............-............../..-........../.......................\...-...||........./.-.....-....../........
|
||||
.......-.......-........................................../\\.......|......./../..\........\..-.........../../
|
||||
....../../.......................\.........\-....\.|..................\......................./...-\..........
|
||||
\.......-........\...-.....................\....-........./-...|......|.......-........................\...\..
|
||||
...|\.................................../..../..........|......-......../-..|......./..........\../..|......-\
|
||||
..........\...........................|..-........-/-......../....|...............................\.....|.....
|
||||
..............\......-............................-.../........|........................./........-...........
|
||||
.............-..\.//.....................-....-......|....../....-............................/..............|
|
||||
\........../....|................./.....\......\.../.................|........\............../................
|
||||
.....-........-/|.........\.....-./............|...\.|......|.......|...................\\.....\.............-
|
||||
................|.-...-.....................|..........-....\....\......../...............................././
|
||||
...........|.......\..............\......................................./........-..........................
|
||||
...........................-..../............|............................|...........\.......................
|
||||
....................|..........|..................../...........\.....|.........-............\.\...-..\.......
|
||||
................................-......-......\.....-/......\...\................/................-...........
|
||||
..|.....\..\......|../....................................................\\......-...../..../..............//
|
||||
.........\.................\..\..-.-..................\.....\..\.....\..........-.............................
|
||||
...................\............/..\............|.............../..\............................|\.\...../....
|
||||
......|...............\.......|......|/........|....-.......|...........-.../.\....\.....|./.......|..........
|
||||
....\/|................-.-..........|.................../..............|../-...|/..........|..................
|
||||
..|........./-\.............|...|............|......\...................\..../.........|...............|.-....
|
||||
...................-................\....|/....-...|......./....../..........-|............/......\../..\\....
|
||||
...........................-..........................................-...|.|................\../...........-.
|
||||
......../.....|.........-.......|........./-............|../.......|......-.-.-.......................-..|-...
|
||||
.........|-...............|............./.....|........../..|........\..........|/.............../-...........
|
||||
...\.....|..|...........\....-...\/.........................................|...................\......-.-....
|
||||
.../...-...|.............|.....\...|.................................../..............\.................../...
|
||||
..........-.........../....|.....|..-.........../.................................-..................\....\/..
|
||||
....../..............\../......../.....-./....|../.\....-.................../............................../.\
|
||||
......-.|..........................\...............|.......-...-....../.............//...\|................/..
|
||||
................/.........|........................|......./..|......../-...........................\....|....
|
||||
........../...|.........\...........-./......\\...........\......|-......|...\...............\................
|
||||
../.........................|.................-/...........--.........\.../........................\.........\
|
||||
........\..|...|.............../...................-.........|.................\..|......./.........-.....-|..
|
||||
\.../.......|.............|-.../.................\...\..........\...|..........\....../......-................
|
||||
............|.|....\..--............-/-..................../........................-../..\..-................
|
||||
.....................................|.................../.................................|..../..-......\...
|
||||
....|..............|..-.....|../.........................................|........\.................|.........
|
||||
..............\..|...............\....||........../................................\................./.\......
|
||||
.....................-../......./....../.................................-............\........../............
|
||||
.....|.............../......-.\.|........-...................|.....-........\...-.............-....-.......-..
|
||||
..../.....|..............\../..............................\........|....................|..............\.....
|
||||
....\................-........\../......|..../......................-.....|............../.../........../.....
|
||||
....-...........................-.............|...........\..|........|.......\././.....|./..........\........
|
||||
/....................\..............\.............................-......................../\......../....-...
|
||||
......\..................-............................................./.\...../.............\....-....\.\....
|
||||
..................................\-............................/.......|........................-|...........
|
||||
.................../.../.......|./............\.........\....-.-....-../\.........|........./...\.............
|
||||
......./.../....|...../|......................|.....|.....|.........|...........\......-.\..................|.
|
||||
..././...........................|.......\.|......-........./.................................................
|
||||
........|.|.......................-....................././.......||...........|/....-....\.......|......\/...
|
||||
.\.\.....|....\......-....|...|.....//........|..-.........-.................-........./......................
|
||||
.|.....................\............-.................................|..../.............-....../.........../.
|
||||
.|..\..../...............\..................../...\............................-....../................../.|..
|
||||
./.\............................/.............-...../-................\.........\.............|...../.........
|
||||
..........\...............................\............../.........\.....-/........./|........................
|
||||
.............\..|....|..................................\.........|./......................\.........-........
|
||||
../.....|-............|...\................|...-....-........./........|.-..........\.........................
|
||||
........-............./...........--................../...............................|..|.\....\.............
|
||||
\.............-\.........................-|......|/.........\............/...........-.../.\........\..\.../..
|
||||
......................|........\....-../.............|......|.-...................................-|../...-...
|
||||
.............|...|.....-...........|.....-...............|...\........................./..\....\..............
|
||||
..............|.............-.........../....-..................................|......./........|............
|
||||
...........|.-..../......................................\....-...\-......../........-..........-......-.....|
|
||||
../...........-............-.../|...........-.-.............\.............................|.............-.....
|
||||
.........../...-............../........./...................................../......-.......\\...............
|
||||
........................./.||......|...../.......|....|..................-..........|......\..................
|
||||
............/....-./..-...........|...-..........\....../...\/.......|\.....\....|........../..\.\............
|
||||
.......................................-.../.......|............|........|...\..........\.....-...............
|
||||
/..\|.............-...-.................................\........\...................\......|....-............
|
||||
..................\............../........................./.........|..........\...\......\..........|......|
|
||||
.../.................................................../...|............../....\...\...../........|.......-...
|
||||
..................-.-..........................\.................-......................-..\.........-........
|
||||
...................../\.....\.............\.............../................\.|............../........./.......
|
||||
....................|../.\./......................................-.../.......\...............................
|
||||
|........................-..............................................|...............................-.....
|
||||
....\.\...........\......|.........\/|..|....|.....\............-...../.............................\\........
|
||||
......\....|......\|.....-..................\........\.......................-............-.|..............|..
|
||||
....|.....././.......................|......../...........-.|............./......-.|....../.....\......|....\.
|
||||
.........\........|.......\..........|........./..................\.........................|................-
|
||||
.....\..........\.....-......../...|-........../...\/|........................................................
|
||||
.../.....................\../.........\.|.........-..........\...............................|...............\
|
||||
.........-...........................................-.|...........\......//............../..|.\............/.
|
||||
.-|../...../.........|............./..........................|..-.\......\............\................../...
|
||||
../....../.................|..............\.........|.\......\...../.......\............\./.......|....../..\.
|
||||
......../.-..-......\.........................\|...................................-....../...................
|
||||
......................-....|........./\................|......\..-\....../.......\.................\/.-\......
|
||||
............\...|...............|............./...........................................\....-.-............
|
||||
\.........|.............................|............/.........-.....\........\|...-..-..\/.../......./.......
|
||||
.............................\.|...............\....\..\-.....................\......-...../......\..../.....\
|
||||
..\-......\.\........-........../........\...............\..................../....-....\.\.|.|...............
|
||||
................|./........../.................................-.............|...................\............
|
124
2023/day16/main.go
Normal file
124
2023/day16/main.go
Normal file
@ -0,0 +1,124 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inp := h.StdinToStringSlice()
|
||||
part1(inp)
|
||||
fmt.Println()
|
||||
part2(inp)
|
||||
}
|
||||
|
||||
var (
|
||||
N = h.Coordinate{X: 0, Y: -1}
|
||||
E = h.Coordinate{X: 1, Y: 0}
|
||||
S = h.Coordinate{X: 0, Y: 1}
|
||||
W = h.Coordinate{X: -1, Y: 0}
|
||||
)
|
||||
|
||||
// movement describes how a beam moving in a direction should react
|
||||
// to a byte
|
||||
var movement = map[h.Coordinate]map[byte][]h.Coordinate{
|
||||
N: {
|
||||
'|': {N},
|
||||
'-': {W, E},
|
||||
'\\': {W},
|
||||
'/': {E},
|
||||
'.': {N},
|
||||
},
|
||||
E: {
|
||||
'|': {N, S},
|
||||
'-': {E},
|
||||
'\\': {S},
|
||||
'/': {N},
|
||||
'.': {E},
|
||||
},
|
||||
S: {
|
||||
'|': {S},
|
||||
'-': {W, E},
|
||||
'\\': {E},
|
||||
'/': {W},
|
||||
'.': {S},
|
||||
},
|
||||
W: {
|
||||
'|': {N, S},
|
||||
'-': {W},
|
||||
'\\': {N},
|
||||
'/': {S},
|
||||
'.': {W},
|
||||
},
|
||||
}
|
||||
|
||||
var tileHistory map[h.Coordinate][]h.Coordinate
|
||||
|
||||
func part1(input []string) {
|
||||
mm := h.StringSliceToCoordByteMap(input)
|
||||
tileHistory = make(map[h.Coordinate][]h.Coordinate)
|
||||
proc(&mm, E, h.Coordinate{X: 0, Y: 0})
|
||||
|
||||
fmt.Println("# Part 1")
|
||||
fmt.Println(len(tileHistory))
|
||||
}
|
||||
|
||||
func part2(input []string) {
|
||||
mm := h.StringSliceToCoordByteMap(input)
|
||||
|
||||
maxTiles := h.MIN_INT
|
||||
// starts are a map of positions -> directions to test as a starting point
|
||||
starts := make(map[*h.Coordinate]h.Coordinate)
|
||||
for y := mm.TLY; y <= mm.BRY; y++ {
|
||||
for x := mm.TLX; x <= mm.BRX; x++ {
|
||||
if y != mm.TLY && x != mm.TLX && y != mm.BRY && x != mm.BRX {
|
||||
continue
|
||||
}
|
||||
if y == mm.TLY {
|
||||
// South facing beams
|
||||
starts[&h.Coordinate{Y: y, X: x}] = S
|
||||
} else if y == mm.BRY {
|
||||
// North facing beams
|
||||
starts[&h.Coordinate{Y: y, X: x}] = N
|
||||
}
|
||||
if x == mm.TLX {
|
||||
// East facing beams
|
||||
starts[&h.Coordinate{Y: y, X: x}] = E
|
||||
}
|
||||
if x == mm.BRX {
|
||||
// West facing beams
|
||||
starts[&h.Coordinate{Y: y, X: x}] = W
|
||||
}
|
||||
}
|
||||
}
|
||||
for pos, dir := range starts {
|
||||
tileHistory = make(map[h.Coordinate][]h.Coordinate)
|
||||
proc(&mm, dir, *pos)
|
||||
if len(tileHistory) > maxTiles {
|
||||
maxTiles = len(tileHistory)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("# Part 2")
|
||||
fmt.Println(maxTiles)
|
||||
}
|
||||
|
||||
func proc(mm *h.CoordByteMap, dir, pos h.Coordinate) {
|
||||
if !mm.ContainsCoord(pos) {
|
||||
return
|
||||
}
|
||||
if visits, ok := tileHistory[pos]; ok {
|
||||
for _, v := range visits {
|
||||
if v == dir {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
curr := mm.Get(pos)
|
||||
tileHistory[pos] = append(tileHistory[pos], dir)
|
||||
next := movement[dir][curr]
|
||||
for _, n := range next {
|
||||
proc(mm, n, pos.Add(n))
|
||||
}
|
||||
}
|
203
2023/day16/problem
Normal file
203
2023/day16/problem
Normal file
@ -0,0 +1,203 @@
|
||||
[1]Advent of Code
|
||||
|
||||
• [2][About]
|
||||
• [3][Events]
|
||||
• [4][Shop]
|
||||
• [5][Settings]
|
||||
• [6][Log Out]
|
||||
|
||||
br0xen [7](AoC++) 32*
|
||||
|
||||
λy.[8]2023
|
||||
|
||||
• [9][Calendar]
|
||||
• [10][AoC++]
|
||||
• [11][Sponsors]
|
||||
• [12][Leaderboard]
|
||||
• [13][Stats]
|
||||
|
||||
Our [14]sponsors help make Advent of Code possible:
|
||||
[15]JPMorgan Chase - With over 57,000 technologists globally and an annual
|
||||
tech spend of $15 billion, JPMorgan Chase is dedicated to improving the
|
||||
design, analytics, coding and testing that goes into creating high quality
|
||||
software products.
|
||||
|
||||
--- Day 16: The Floor Will Be Lava ---
|
||||
|
||||
With the beam of light completely focused somewhere, the reindeer leads
|
||||
you deeper still into the Lava Production Facility. At some point, you
|
||||
realize that the steel facility walls have been replaced with cave, and
|
||||
the doorways are just cave, and the floor is cave, and you're pretty sure
|
||||
this is actually just a giant cave.
|
||||
|
||||
Finally, as you approach what must be the heart of the mountain, you see a
|
||||
bright light in a cavern up ahead. There, you discover that the beam of
|
||||
light you so carefully focused is emerging from the cavern wall closest to
|
||||
the facility and pouring all of its energy into a contraption on the
|
||||
opposite side.
|
||||
|
||||
Upon closer inspection, the contraption appears to be a flat,
|
||||
two-dimensional square grid containing empty space (.), mirrors (/ and \),
|
||||
and splitters (| and -).
|
||||
|
||||
The contraption is aligned so that most of the beam bounces around the
|
||||
grid, but each tile on the grid converts some of the beam's light into
|
||||
heat to melt the rock in the cavern.
|
||||
|
||||
You note the layout of the contraption (your puzzle input). For example:
|
||||
|
||||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
||||
|
||||
The beam enters in the top-left corner from the left and heading to the
|
||||
right. Then, its behavior depends on what it encounters as it moves:
|
||||
|
||||
• If the beam encounters empty space (.), it continues in the same
|
||||
direction.
|
||||
• If the beam encounters a mirror (/ or \), the beam is reflected 90
|
||||
degrees depending on the angle of the mirror. For instance, a
|
||||
rightward-moving beam that encounters a / mirror would continue upward
|
||||
in the mirror's column, while a rightward-moving beam that encounters
|
||||
a \ mirror would continue downward from the mirror's column.
|
||||
• If the beam encounters the pointy end of a splitter (| or -), the beam
|
||||
passes through the splitter as if the splitter were empty space. For
|
||||
instance, a rightward-moving beam that encounters a - splitter would
|
||||
continue in the same direction.
|
||||
• If the beam encounters the flat side of a splitter (| or -), the beam
|
||||
is split into two beams going in each of the two directions the
|
||||
splitter's pointy ends are pointing. For instance, a rightward-moving
|
||||
beam that encounters a | splitter would split into two beams: one that
|
||||
continues upward from the splitter's column and one that continues
|
||||
downward from the splitter's column.
|
||||
|
||||
Beams do not interact with other beams; a tile can have many beams passing
|
||||
through it at the same time. A tile is energized if that tile has at least
|
||||
one beam pass through it, reflect in it, or split in it.
|
||||
|
||||
In the above example, here is how the beam of light bounces around the
|
||||
contraption:
|
||||
|
||||
>|<<<\....
|
||||
|v-.\^....
|
||||
.v...|->>>
|
||||
.v...v^.|.
|
||||
.v...v^...
|
||||
.v...v^..\
|
||||
.v../2\\..
|
||||
<->-/vv|..
|
||||
.|<<<2-|.\
|
||||
.v//.|.v..
|
||||
|
||||
Beams are only shown on empty tiles; arrows indicate the direction of the
|
||||
beams. If a tile contains beams moving in multiple directions, the number
|
||||
of distinct directions is shown instead. Here is the same diagram but
|
||||
instead only showing whether a tile is energized (#) or not (.):
|
||||
|
||||
######....
|
||||
.#...#....
|
||||
.#...#####
|
||||
.#...##...
|
||||
.#...##...
|
||||
.#...##...
|
||||
.#..####..
|
||||
########..
|
||||
.#######..
|
||||
.#...#.#..
|
||||
|
||||
Ultimately, in this example, 46 tiles become energized.
|
||||
|
||||
The light isn't energizing enough tiles to produce lava; to debug the
|
||||
contraption, you need to start by analyzing the current situation. With
|
||||
the beam starting in the top-left heading right, how many tiles end up
|
||||
being energized?
|
||||
|
||||
Your puzzle answer was 6816.
|
||||
|
||||
--- Part Two ---
|
||||
|
||||
As you try to work out what might be wrong, the reindeer tugs on your
|
||||
shirt and leads you to a nearby control panel. There, a collection of
|
||||
buttons lets you align the contraption so that the beam enters from any
|
||||
edge tile and heading away from that edge. (You can choose either of two
|
||||
directions for the beam if it starts on a corner; for instance, if the
|
||||
beam starts in the bottom-right corner, it can start heading either left
|
||||
or upward.)
|
||||
|
||||
So, the beam could start on any tile in the top row (heading downward),
|
||||
any tile in the bottom row (heading upward), any tile in the leftmost
|
||||
column (heading right), or any tile in the rightmost column (heading
|
||||
left). To produce lava, you need to find the configuration that energizes
|
||||
as many tiles as possible.
|
||||
|
||||
In the above example, this can be achieved by starting the beam in the
|
||||
fourth tile from the left in the top row:
|
||||
|
||||
.|<2<\....
|
||||
|v-v\^....
|
||||
.v.v.|->>>
|
||||
.v.v.v^.|.
|
||||
.v.v.v^...
|
||||
.v.v.v^..\
|
||||
.v.v/2\\..
|
||||
<-2-/vv|..
|
||||
.|<<<2-|.\
|
||||
.v//.|.v..
|
||||
|
||||
Using this configuration, 51 tiles are energized:
|
||||
|
||||
.#####....
|
||||
.#.#.#....
|
||||
.#.#.#####
|
||||
.#.#.##...
|
||||
.#.#.##...
|
||||
.#.#.##...
|
||||
.#.#####..
|
||||
########..
|
||||
.#######..
|
||||
.#...#.#..
|
||||
|
||||
Find the initial beam configuration that energizes the largest number of
|
||||
tiles; how many tiles are energized in that configuration?
|
||||
|
||||
Your puzzle answer was 8163.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
At this point, you should [16]return to your Advent calendar and try
|
||||
another puzzle.
|
||||
|
||||
If you still want to see it, you can [17]get your puzzle input.
|
||||
|
||||
You can also [Shareon [18]Twitter [19]Mastodon] this puzzle.
|
||||
|
||||
References
|
||||
|
||||
Visible links
|
||||
1. https://adventofcode.com/
|
||||
2. https://adventofcode.com/2023/about
|
||||
3. https://adventofcode.com/2023/events
|
||||
4. https://teespring.com/stores/advent-of-code
|
||||
5. https://adventofcode.com/2023/settings
|
||||
6. https://adventofcode.com/2023/auth/logout
|
||||
7. Advent of Code Supporter
|
||||
https://adventofcode.com/2023/support
|
||||
8. https://adventofcode.com/2023
|
||||
9. https://adventofcode.com/2023
|
||||
10. https://adventofcode.com/2023/support
|
||||
11. https://adventofcode.com/2023/sponsors
|
||||
12. https://adventofcode.com/2023/leaderboard
|
||||
13. https://adventofcode.com/2023/stats
|
||||
14. https://adventofcode.com/2023/sponsors
|
||||
15. https://www.jpmorgan.com/
|
||||
16. https://adventofcode.com/2023
|
||||
17. https://adventofcode.com/2023/day/16/input
|
||||
18. https://twitter.com/intent/tweet?text=I%27ve+completed+%22The+Floor+Will+Be+Lava%22+%2D+Day+16+%2D+Advent+of+Code+2023&url=https%3A%2F%2Fadventofcode%2Ecom%2F2023%2Fday%2F16&related=ericwastl&hashtags=AdventOfCode
|
||||
19. javascript:void(0);
|
10
2023/day16/testinput
Normal file
10
2023/day16/testinput
Normal file
@ -0,0 +1,10 @@
|
||||
.|...\....
|
||||
|.-.\.....
|
||||
.....|-...
|
||||
........|.
|
||||
..........
|
||||
.........\
|
||||
..../.\\..
|
||||
.-.-/..|..
|
||||
.|....-|.\
|
||||
..//.|....
|
Loading…
Reference in New Issue
Block a user