2022 day16 started
This commit is contained in:
parent
c23342023b
commit
33d1a7c3c6
111
2022/day16/main.go
Normal file
111
2022/day16/main.go
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := h.StdinToStringSlice()
|
||||||
|
part1(inp)
|
||||||
|
}
|
||||||
|
|
||||||
|
func part1(inp []string) {
|
||||||
|
volcano := NewVolcano(inp)
|
||||||
|
timeLeft := 30
|
||||||
|
currRoom := volcano.FindRoom("AA")
|
||||||
|
_, _ = timeLeft, currRoom
|
||||||
|
fmt.Println("Steps from AA -> JJ:", volcano.CountSteps("AA", "JJ"))
|
||||||
|
}
|
||||||
|
|
||||||
|
type Volcano struct {
|
||||||
|
rooms []*Room
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewVolcano(inp []string) *Volcano {
|
||||||
|
v := &Volcano{}
|
||||||
|
for i := range inp {
|
||||||
|
v.rooms = append(v.rooms, StringToRoom(inp[i]))
|
||||||
|
}
|
||||||
|
for i := range v.rooms {
|
||||||
|
for _, valve := range v.rooms[i].RawTunnels {
|
||||||
|
v.rooms[i].Tunnels = append(v.rooms[i].Tunnels, v.FindRoom(valve))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Volcano) CountSteps(from string, to string) int {
|
||||||
|
start, end := v.FindRoom(from), v.FindRoom(to)
|
||||||
|
if start == nil || end == nil {
|
||||||
|
fmt.Println("Couldn't find requested rooms:", from, ":", start, " ; ", to, ":", end)
|
||||||
|
return math.MaxInt
|
||||||
|
}
|
||||||
|
return v.TrackStepCount(start, end, []*Room{})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Volcano) TrackStepCount(from *Room, to *Room, visited []*Room) int {
|
||||||
|
if from == to {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
minSteps := math.MaxInt
|
||||||
|
for _, t := range from.Tunnels {
|
||||||
|
fmt.Println("TrackStepCount:", from, "->", to, "::", t)
|
||||||
|
if !IsRoomIn(t, visited) {
|
||||||
|
fmt.Println(" Haven't Visited")
|
||||||
|
wrk := v.TrackStepCount(t, to, append(visited, t)) + 1
|
||||||
|
minSteps = h.Min(minSteps, wrk)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minSteps
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v *Volcano) FindRoom(valve string) *Room {
|
||||||
|
for _, r := range v.rooms {
|
||||||
|
if r.Valve == valve {
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsRoomIn(room *Room, rooms []*Room) bool {
|
||||||
|
for i := range rooms {
|
||||||
|
if rooms[i] == room {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
type Room struct {
|
||||||
|
Valve string
|
||||||
|
FlowRate int
|
||||||
|
RawTunnels []string
|
||||||
|
Tunnels []*Room
|
||||||
|
}
|
||||||
|
|
||||||
|
func StringToRoom(s string) *Room {
|
||||||
|
room := &Room{}
|
||||||
|
r := strings.NewReader(s)
|
||||||
|
fmt.Fscanf(r, "Valve %s has flow rate=%d; tunnels lead to valve", &room.Valve, &room.FlowRate)
|
||||||
|
readTunnels := strings.Split(s, " valve")[1]
|
||||||
|
if readTunnels[0] == ' ' {
|
||||||
|
readTunnels = readTunnels[1:]
|
||||||
|
} else {
|
||||||
|
readTunnels = readTunnels[2:]
|
||||||
|
}
|
||||||
|
room.RawTunnels = strings.Split(readTunnels, ", ")
|
||||||
|
return room
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r Room) String() string {
|
||||||
|
return r.Valve
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r Room) FullString() string {
|
||||||
|
return fmt.Sprintf("Valve %s has flow rate=%d; tunnels lead to valves %v", r.Valve, r.FlowRate, r.RawTunnels)
|
||||||
|
}
|
214
2022/day16/problem
Normal file
214
2022/day16/problem
Normal file
@ -0,0 +1,214 @@
|
|||||||
|
Advent of Code
|
||||||
|
|
||||||
|
• [About]
|
||||||
|
• [Events]
|
||||||
|
• [Shop]
|
||||||
|
• [Settings]
|
||||||
|
• [Log Out]
|
||||||
|
|
||||||
|
br0xen (AoC++) 29*
|
||||||
|
|
||||||
|
/^2022$/
|
||||||
|
|
||||||
|
• [Calendar]
|
||||||
|
• [AoC++]
|
||||||
|
• [Sponsors]
|
||||||
|
• [Leaderboard]
|
||||||
|
• [Stats]
|
||||||
|
|
||||||
|
Our sponsors help make Advent of Code possible:
|
||||||
|
Sentry.io - More than 3.5 million developers across 85,000 organizations ship better software, faster, with Sentry. What
|
||||||
|
are you waiting for?
|
||||||
|
|
||||||
|
--- Day 16: Proboscidea Volcanium ---
|
||||||
|
|
||||||
|
The sensors have led you to the origin of the distress signal: yet another handheld device, just like the one the Elves
|
||||||
|
gave you. However, you don't see any Elves around; instead, the device is surrounded by elephants! They must have gotten
|
||||||
|
lost in these tunnels, and one of the elephants apparently figured out how to turn on the distress signal.
|
||||||
|
|
||||||
|
The ground rumbles again, much stronger this time. What kind of cave is this, exactly? You scan the cave with your
|
||||||
|
handheld device; it reports mostly igneous rock, some ash, pockets of pressurized gas, magma... this isn't just a cave,
|
||||||
|
it's a volcano!
|
||||||
|
|
||||||
|
You need to get the elephants out of here, quickly. Your device estimates that you have 30 minutes before the volcano
|
||||||
|
erupts, so you don't have time to go back out the way you came in.
|
||||||
|
|
||||||
|
You scan the cave for other options and discover a network of pipes and pressure-release valves. You aren't sure how
|
||||||
|
such a system got into a volcano, but you don't have time to complain; your device produces a report (your puzzle input)
|
||||||
|
of each valve's flow rate if it were opened (in pressure per minute) and the tunnels you could use to move between the
|
||||||
|
valves.
|
||||||
|
|
||||||
|
There's even a valve in the room you and the elephants are currently standing in labeled AA. You estimate it will take
|
||||||
|
you one minute to open a single valve and one minute to follow any tunnel from one valve to another. What is the most
|
||||||
|
pressure you could release?
|
||||||
|
|
||||||
|
For example, suppose you had the following scan output:
|
||||||
|
|
||||||
|
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||||
|
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||||
|
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||||
|
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||||
|
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||||
|
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||||
|
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||||
|
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||||
|
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||||
|
Valve JJ has flow rate=21; tunnel leads to valve II
|
||||||
|
|
||||||
|
All of the valves begin closed. You start at valve AA, but it must be damaged or jammed or something: its flow rate is
|
||||||
|
0, so there's no point in opening it. However, you could spend one minute moving to valve BB and another minute opening
|
||||||
|
it; doing so would release pressure during the remaining 28 minutes at a flow rate of 13, a total eventual pressure
|
||||||
|
release of 28 * 13 = 364. Then, you could spend your third minute moving to valve CC and your fourth minute opening it,
|
||||||
|
providing an additional 26 minutes of eventual pressure release at a flow rate of 2, or 52 total pressure released by
|
||||||
|
valve CC.
|
||||||
|
|
||||||
|
Making your way through the tunnels like this, you could probably open many or all of the valves by the time 30 minutes
|
||||||
|
have elapsed. However, you need to release as much pressure as possible, so you'll need to be methodical. Instead,
|
||||||
|
consider this approach:
|
||||||
|
|
||||||
|
== Minute 1 ==
|
||||||
|
No valves are open.
|
||||||
|
You move to valve DD.
|
||||||
|
|
||||||
|
== Minute 2 ==
|
||||||
|
No valves are open.
|
||||||
|
You open valve DD.
|
||||||
|
|
||||||
|
== Minute 3 ==
|
||||||
|
Valve DD is open, releasing 20 pressure.
|
||||||
|
You move to valve CC.
|
||||||
|
|
||||||
|
== Minute 4 ==
|
||||||
|
Valve DD is open, releasing 20 pressure.
|
||||||
|
You move to valve BB.
|
||||||
|
|
||||||
|
== Minute 5 ==
|
||||||
|
Valve DD is open, releasing 20 pressure.
|
||||||
|
You open valve BB.
|
||||||
|
|
||||||
|
== Minute 6 ==
|
||||||
|
Valves BB and DD are open, releasing 33 pressure.
|
||||||
|
You move to valve AA.
|
||||||
|
|
||||||
|
== Minute 7 ==
|
||||||
|
Valves BB and DD are open, releasing 33 pressure.
|
||||||
|
You move to valve II.
|
||||||
|
|
||||||
|
== Minute 8 ==
|
||||||
|
Valves BB and DD are open, releasing 33 pressure.
|
||||||
|
You move to valve JJ.
|
||||||
|
|
||||||
|
== Minute 9 ==
|
||||||
|
Valves BB and DD are open, releasing 33 pressure.
|
||||||
|
You open valve JJ.
|
||||||
|
|
||||||
|
== Minute 10 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve II.
|
||||||
|
|
||||||
|
== Minute 11 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve AA.
|
||||||
|
|
||||||
|
== Minute 12 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve DD.
|
||||||
|
|
||||||
|
== Minute 13 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve EE.
|
||||||
|
|
||||||
|
== Minute 14 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve FF.
|
||||||
|
|
||||||
|
== Minute 15 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve GG.
|
||||||
|
|
||||||
|
== Minute 16 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You move to valve HH.
|
||||||
|
|
||||||
|
== Minute 17 ==
|
||||||
|
Valves BB, DD, and JJ are open, releasing 54 pressure.
|
||||||
|
You open valve HH.
|
||||||
|
|
||||||
|
== Minute 18 ==
|
||||||
|
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||||
|
You move to valve GG.
|
||||||
|
|
||||||
|
== Minute 19 ==
|
||||||
|
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||||
|
You move to valve FF.
|
||||||
|
|
||||||
|
== Minute 20 ==
|
||||||
|
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||||
|
You move to valve EE.
|
||||||
|
|
||||||
|
== Minute 21 ==
|
||||||
|
Valves BB, DD, HH, and JJ are open, releasing 76 pressure.
|
||||||
|
You open valve EE.
|
||||||
|
|
||||||
|
== Minute 22 ==
|
||||||
|
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||||
|
You move to valve DD.
|
||||||
|
|
||||||
|
== Minute 23 ==
|
||||||
|
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||||
|
You move to valve CC.
|
||||||
|
|
||||||
|
== Minute 24 ==
|
||||||
|
Valves BB, DD, EE, HH, and JJ are open, releasing 79 pressure.
|
||||||
|
You open valve CC.
|
||||||
|
|
||||||
|
== Minute 25 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
== Minute 26 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
== Minute 27 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
== Minute 28 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
== Minute 29 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
== Minute 30 ==
|
||||||
|
Valves BB, CC, DD, EE, HH, and JJ are open, releasing 81 pressure.
|
||||||
|
|
||||||
|
This approach lets you release the most pressure possible in 30 minutes with this valve layout, 1651.
|
||||||
|
|
||||||
|
Work out the steps to release the most pressure in 30 minutes. What is the most pressure you can release?
|
||||||
|
|
||||||
|
To begin, get your puzzle input.
|
||||||
|
|
||||||
|
Answer: _____________________ [ [Submit] ]
|
||||||
|
|
||||||
|
You can also [Shareon Twitter Mastodon] this puzzle.
|
||||||
|
|
||||||
|
References
|
||||||
|
|
||||||
|
Visible links
|
||||||
|
. https://adventofcode.com/
|
||||||
|
. https://adventofcode.com/2022/about
|
||||||
|
. https://adventofcode.com/2022/events
|
||||||
|
. https://teespring.com/stores/advent-of-code
|
||||||
|
. https://adventofcode.com/2022/settings
|
||||||
|
. https://adventofcode.com/2022/auth/logout
|
||||||
|
. Advent of Code Supporter
|
||||||
|
https://adventofcode.com/2022/support
|
||||||
|
. https://adventofcode.com/2022
|
||||||
|
. https://adventofcode.com/2022
|
||||||
|
. https://adventofcode.com/2022/support
|
||||||
|
. https://adventofcode.com/2022/sponsors
|
||||||
|
. https://adventofcode.com/2022/leaderboard
|
||||||
|
. https://adventofcode.com/2022/stats
|
||||||
|
. https://adventofcode.com/2022/sponsors
|
||||||
|
. https://sentry.io/
|
||||||
|
. https://adventofcode.com/2022/day/16/input
|
||||||
|
. https://twitter.com/intent/tweet?text=%22Proboscidea+Volcanium%22+%2D+Day+16+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F16&related=ericwastl&hashtags=AdventOfCode
|
||||||
|
. javascript:void(0);
|
10
2022/day16/testinput
Normal file
10
2022/day16/testinput
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
Valve AA has flow rate=0; tunnels lead to valves DD, II, BB
|
||||||
|
Valve BB has flow rate=13; tunnels lead to valves CC, AA
|
||||||
|
Valve CC has flow rate=2; tunnels lead to valves DD, BB
|
||||||
|
Valve DD has flow rate=20; tunnels lead to valves CC, AA, EE
|
||||||
|
Valve EE has flow rate=3; tunnels lead to valves FF, DD
|
||||||
|
Valve FF has flow rate=0; tunnels lead to valves EE, GG
|
||||||
|
Valve GG has flow rate=0; tunnels lead to valves FF, HH
|
||||||
|
Valve HH has flow rate=22; tunnel leads to valve GG
|
||||||
|
Valve II has flow rate=0; tunnels lead to valves AA, JJ
|
||||||
|
Valve JJ has flow rate=21; tunnel leads to valve II
|
Loading…
Reference in New Issue
Block a user