Day 16
This commit is contained in:
parent
cc7c5b88f0
commit
5899cde85a
2 changed files with 126 additions and 0 deletions
50
aoc/resources/day16Input.txt
Normal file
50
aoc/resources/day16Input.txt
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
Valve DJ has flow rate=0; tunnels lead to valves ZH, AA
|
||||
Valve LP has flow rate=0; tunnels lead to valves AA, EE
|
||||
Valve GT has flow rate=0; tunnels lead to valves FJ, AW
|
||||
Valve RO has flow rate=5; tunnels lead to valves NO, FD, QV, BV
|
||||
Valve PS has flow rate=0; tunnels lead to valves FY, UV
|
||||
Valve QV has flow rate=0; tunnels lead to valves EB, RO
|
||||
Valve MV has flow rate=0; tunnels lead to valves FL, EB
|
||||
Valve RN has flow rate=0; tunnels lead to valves AW, LQ
|
||||
Valve HF has flow rate=0; tunnels lead to valves QN, HW
|
||||
Valve PY has flow rate=19; tunnel leads to valve SN
|
||||
Valve AT has flow rate=0; tunnels lead to valves YQ, UY
|
||||
Valve UY has flow rate=3; tunnels lead to valves KV, ID, AT, PB, PG
|
||||
Valve YI has flow rate=0; tunnels lead to valves FL, FD
|
||||
Valve EB has flow rate=8; tunnels lead to valves MV, GQ, QV
|
||||
Valve ID has flow rate=0; tunnels lead to valves NO, UY
|
||||
Valve FY has flow rate=15; tunnels lead to valves LQ, PS
|
||||
Valve GQ has flow rate=0; tunnels lead to valves EB, KM
|
||||
Valve HW has flow rate=0; tunnels lead to valves FJ, HF
|
||||
Valve CQ has flow rate=17; tunnels lead to valves KM, GO
|
||||
Valve AW has flow rate=20; tunnels lead to valves RN, GT, WH, MX
|
||||
Valve BV has flow rate=0; tunnels lead to valves RO, ZH
|
||||
Valve PB has flow rate=0; tunnels lead to valves UY, AA
|
||||
Valve MX has flow rate=0; tunnels lead to valves AW, YG
|
||||
Valve DE has flow rate=4; tunnels lead to valves MM, PZ, PG, DS, EP
|
||||
Valve AA has flow rate=0; tunnels lead to valves EP, PB, LP, JT, DJ
|
||||
Valve QN has flow rate=23; tunnels lead to valves SN, HF
|
||||
Valve GO has flow rate=0; tunnels lead to valves CQ, MK
|
||||
Valve PZ has flow rate=0; tunnels lead to valves IJ, DE
|
||||
Valve PG has flow rate=0; tunnels lead to valves UY, DE
|
||||
Valve FL has flow rate=18; tunnels lead to valves MV, YI
|
||||
Valve DS has flow rate=0; tunnels lead to valves DE, ZH
|
||||
Valve ZH has flow rate=11; tunnels lead to valves YQ, BV, DJ, DS, SB
|
||||
Valve KV has flow rate=0; tunnels lead to valves UY, IJ
|
||||
Valve UV has flow rate=9; tunnels lead to valves MM, PS, YG
|
||||
Valve WH has flow rate=0; tunnels lead to valves JT, AW
|
||||
Valve FD has flow rate=0; tunnels lead to valves YI, RO
|
||||
Valve FJ has flow rate=24; tunnels lead to valves HW, GT
|
||||
Valve JT has flow rate=0; tunnels lead to valves AA, WH
|
||||
Valve SN has flow rate=0; tunnels lead to valves PY, QN
|
||||
Valve KM has flow rate=0; tunnels lead to valves GQ, CQ
|
||||
Valve LQ has flow rate=0; tunnels lead to valves RN, FY
|
||||
Valve NO has flow rate=0; tunnels lead to valves ID, RO
|
||||
Valve SB has flow rate=0; tunnels lead to valves ZH, IJ
|
||||
Valve MK has flow rate=25; tunnel leads to valve GO
|
||||
Valve YG has flow rate=0; tunnels lead to valves MX, UV
|
||||
Valve IJ has flow rate=16; tunnels lead to valves EE, KV, PZ, SB
|
||||
Valve EP has flow rate=0; tunnels lead to valves AA, DE
|
||||
Valve MM has flow rate=0; tunnels lead to valves UV, DE
|
||||
Valve YQ has flow rate=0; tunnels lead to valves AT, ZH
|
||||
Valve EE has flow rate=0; tunnels lead to valves LP, IJ
|
||||
76
aoc/src/Day16.scala
Normal file
76
aoc/src/Day16.scala
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
import scala.io.Source
|
||||
import scala.util.chaining.*
|
||||
import scala.collection.mutable
|
||||
|
||||
object Day16 extends App:
|
||||
|
||||
val valves = Source
|
||||
.fromURL(getClass.getResource("day16Input.txt"))
|
||||
.mkString
|
||||
.split('\n')
|
||||
.map(
|
||||
_.drop(6)
|
||||
.replaceAllLiterally("has flow rate=", "")
|
||||
.replaceAllLiterally("; tunnels lead to valves", "")
|
||||
.replaceAllLiterally("; tunnel leads to valve", "")
|
||||
.replaceAllLiterally(",", "")
|
||||
.split(" ")
|
||||
)
|
||||
.map(l => Valve(l.head, l(1).toInt, l.drop(2).toList))
|
||||
|
||||
final case class Valve(name: String, rate: Int, tunnels: List[String])
|
||||
|
||||
val valvesMap = valves.map(v => (v.name, v)).toMap
|
||||
val workingValves = valves.filter(_.rate > 0).map(_.name).toList
|
||||
|
||||
val distances = mutable.Map.from(
|
||||
for
|
||||
valve <- valves
|
||||
targetValves = valves.map(_.name).map((_, 9999)).to(mutable.Map)
|
||||
yield (valve.name, targetValves)
|
||||
)
|
||||
|
||||
for
|
||||
valve <- valves
|
||||
tunnel <- valve.tunnels
|
||||
do distances(valve.name)(tunnel) = 1
|
||||
|
||||
for
|
||||
k <- valves.map(_.name)
|
||||
i <- valves.map(_.name)
|
||||
j <- valves.map(_.name)
|
||||
current = distances(i)(j)
|
||||
dist = distances(i)(k) + distances(k)(j)
|
||||
if current > dist
|
||||
do distances(i)(j) = dist
|
||||
|
||||
def computeFlow(current: String, rest: List[String], timeLeft: Int): Int =
|
||||
rest
|
||||
.filter(distances(current)(_) < timeLeft)
|
||||
.map(r => (r, rest.filterNot(_ == r)))
|
||||
.map { case (r, rest) =>
|
||||
valvesMap(r).rate * (timeLeft - distances(current)(r) - 1) +
|
||||
computeFlow(r, rest, timeLeft - distances(current)(r) - 1)
|
||||
}
|
||||
.prepended(0)
|
||||
.max
|
||||
|
||||
def computeFlow2(current: String, rest: List[String], timeLeft: Int): Int =
|
||||
rest
|
||||
.filter(distances(current)(_) < timeLeft)
|
||||
.map(r => (r, rest.filterNot(_ == r)))
|
||||
.map { case (r, rest) =>
|
||||
valvesMap(r).rate * (timeLeft - distances(current)(r) - 1) +
|
||||
computeFlow2(r, rest, timeLeft - distances(current)(r) - 1)
|
||||
}
|
||||
.prepended(computeFlow("AA", rest, 26))
|
||||
.max
|
||||
|
||||
val part1 = computeFlow("AA", workingValves, 30)
|
||||
println("Part 1:")
|
||||
println(part1)
|
||||
|
||||
val part2 = computeFlow2("AA", workingValves, 26)
|
||||
println("Part 2:")
|
||||
println(part2)
|
||||
end Day16
|
||||
Loading…
Add table
Add a link
Reference in a new issue