diff --git a/day16/input.txt b/day16/input.txt new file mode 100644 index 0000000..682eef1 --- /dev/null +++ b/day16/input.txt @@ -0,0 +1,60 @@ +Valve HM has flow rate=0; tunnels lead to valves LS, YS +Valve IY has flow rate=15; tunnels lead to valves YI, MU, KN, QS, QM +Valve VI has flow rate=22; tunnels lead to valves LE, SE, RB, JR +Valve SE has flow rate=0; tunnels lead to valves VI, AZ +Valve QU has flow rate=0; tunnels lead to valves YC, QK +Valve RB has flow rate=0; tunnels lead to valves AN, VI +Valve PU has flow rate=0; tunnels lead to valves JR, IM +Valve OA has flow rate=0; tunnels lead to valves KZ, FR +Valve AQ has flow rate=23; tunnels lead to valves FA, QM, GE +Valve QS has flow rate=0; tunnels lead to valves IM, IY +Valve HC has flow rate=24; tunnel leads to valve XH +Valve QI has flow rate=0; tunnels lead to valves KQ, LS +Valve FA has flow rate=0; tunnels lead to valves HA, AQ +Valve BA has flow rate=0; tunnels lead to valves KZ, ME +Valve DH has flow rate=0; tunnels lead to valves LT, HA +Valve TE has flow rate=0; tunnels lead to valves AA, ZJ +Valve AA has flow rate=0; tunnels lead to valves YS, XT, TE, GY, FS +Valve YC has flow rate=9; tunnels lead to valves DV, XH, DJ, QU +Valve KN has flow rate=0; tunnels lead to valves IY, AZ +Valve GS has flow rate=0; tunnels lead to valves FS, KZ +Valve DJ has flow rate=0; tunnels lead to valves YC, UV +Valve GY has flow rate=0; tunnels lead to valves QK, AA +Valve ZJ has flow rate=6; tunnels lead to valves RC, HS, UV, ME, TE +Valve RC has flow rate=0; tunnels lead to valves BY, ZJ +Valve QK has flow rate=10; tunnels lead to valves QU, XX, HS, RM, GY +Valve AN has flow rate=0; tunnels lead to valves HA, RB +Valve XT has flow rate=0; tunnels lead to valves AA, KQ +Valve LT has flow rate=0; tunnels lead to valves IM, DH +Valve YI has flow rate=0; tunnels lead to valves LE, IY +Valve BK has flow rate=0; tunnels lead to valves LS, RM +Valve LE has flow rate=0; tunnels lead to valves VI, YI +Valve IM has flow rate=19; tunnels lead to valves PU, EC, QS, LT +Valve SK has flow rate=0; tunnels lead to valves RF, AZ +Valve RM has flow rate=0; tunnels lead to valves QK, BK +Valve YM has flow rate=0; tunnels lead to valves LS, KZ +Valve DV has flow rate=0; tunnels lead to valves YC, AI +Valve QM has flow rate=0; tunnels lead to valves IY, AQ +Valve KZ has flow rate=5; tunnels lead to valves BA, GS, YM, OA, XX +Valve FS has flow rate=0; tunnels lead to valves GS, AA +Valve UV has flow rate=0; tunnels lead to valves DJ, ZJ +Valve AZ has flow rate=20; tunnels lead to valves SE, KN, SK, MS +Valve BY has flow rate=0; tunnels lead to valves RC, LS +Valve OY has flow rate=0; tunnels lead to valves KQ, EI +Valve XX has flow rate=0; tunnels lead to valves KZ, QK +Valve ME has flow rate=0; tunnels lead to valves BA, ZJ +Valve YS has flow rate=0; tunnels lead to valves AA, HM +Valve MS has flow rate=0; tunnels lead to valves AZ, HA +Valve HS has flow rate=0; tunnels lead to valves QK, ZJ +Valve LS has flow rate=3; tunnels lead to valves BK, HM, QI, BY, YM +Valve KQ has flow rate=17; tunnels lead to valves OY, XT, QI +Valve MU has flow rate=0; tunnels lead to valves IY, HA +Valve EC has flow rate=0; tunnels lead to valves IM, GE +Valve XH has flow rate=0; tunnels lead to valves HC, YC +Valve JR has flow rate=0; tunnels lead to valves PU, VI +Valve EI has flow rate=0; tunnels lead to valves OY, RF +Valve AI has flow rate=25; tunnel leads to valve DV +Valve GE has flow rate=0; tunnels lead to valves AQ, EC +Valve RF has flow rate=18; tunnels lead to valves EI, FR, SK +Valve FR has flow rate=0; tunnels lead to valves OA, RF +Valve HA has flow rate=12; tunnels lead to valves AN, FA, MU, MS, DH diff --git a/day16/part1.py b/day16/part1.py new file mode 100644 index 0000000..bbd4ca0 --- /dev/null +++ b/day16/part1.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +import re + +lines = (x.strip() for x in open("input.txt")) +lines = (re.search(r"([A-Z]{2}).*?(\d+).*?([A-Z]{2}(?:, [A-Z]{2})*)", line).groups() for line in lines) +nodes = {name: (int(p), [(1, neighbor) for neighbor in neighbors.split(", ")]) for name, p, neighbors in lines} + +for name in [*nodes.keys()]: + (p, edges) = nodes[name] + if len(edges) != 2 or p != 0: + continue + dist = sum(e[0] for e in edges) + (_, edge1), (_, edge2) = edges + idx = next(i for i, (_, edge_node) in enumerate(nodes[edge1][1]) if edge_node == name) + nodes[edge1][1][idx] = (dist, edge2) + idx = next(i for i, (_, edge_node) in enumerate(nodes[edge2][1]) if edge_node == name) + nodes[edge2][1][idx] = (dist, edge1) + del nodes[name] + +def solve(pos, opened, minute, released, per_minute, path): + if minute < 30 and (minute < 10 or released > 100) and (minute < 20 or released > 800): + pressure, neighbors = nodes[pos] + # open the value + if pos not in opened and pressure > 0: + yield from solve(pos, {pos, *opened}, minute+1, released+per_minute, per_minute+pressure, [*path, ("drain", pos, minute, released)]) + # go to neighbor + if len(opened) < len(nodes)-1: + for dist, name in neighbors: + yield from solve(name, opened, minute+dist, released+per_minute*dist, per_minute, [*path, ("move", pos, "to", name, minute, released)]) + # finish + yield released + (30-minute+1)*per_minute, [*path, ("finish", pos, minute, released, per_minute)] + +mx = 0 +for val, path in solve("AA", set(), 1, 0, 0, []): + if val > mx: + print(val, path) + mx = val + +# 2253 [('move', 'AA', 'to', 'KQ', 1, 0), ('drain', 'KQ', 3, 0), ('move', 'KQ', 'to', 'RF', 4, 0), ('drain', 'RF', 7, 51), ('move', 'RF', 'to', 'AZ', 8, 68), ('drain', 'AZ', 10, 138), ('move', 'AZ', 'to', 'VI', 11, 173), ('drain', 'VI', 13, 283), ('move', 'VI', 'to', 'IM', 14, 338), ('drain', 'IM', 17, 569), ('move', 'IM', 'to', 'IY', 18, 646), ('drain', 'IY', 20, 838), ('move', 'IY', 'to', 'AQ', 21, 934), ('drain', 'AQ', 23, 1156), ('move', 'AQ', 'to', 'HA', 24, 1267), ('drain', 'HA', 26, 1535), ('move', 'HA', 'to', 'IY', 27, 1669), ('finish', 'IY', 29, 1961, 146)] \ No newline at end of file