From fda3e791f48afea53baa2a1b45dd402c826fd57a Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Fri, 16 Dec 2022 01:13:24 -0500 Subject: [PATCH] day16 - just work, nothing done --- 2022/full/day16.txt | 50 ++++++++++++++++ 2022/python/day16.py | 129 +++++++++++++++++++++++++++++++++++++++++ 2022/samples/day16.txt | 10 ++++ 3 files changed, 189 insertions(+) create mode 100644 2022/full/day16.txt create mode 100644 2022/python/day16.py create mode 100644 2022/samples/day16.txt diff --git a/2022/full/day16.txt b/2022/full/day16.txt new file mode 100644 index 0000000..1e10711 --- /dev/null +++ b/2022/full/day16.txt @@ -0,0 +1,50 @@ +Valve QJ has flow rate=11; tunnels lead to valves HB, GL +Valve VZ has flow rate=10; tunnel leads to valve NE +Valve TX has flow rate=19; tunnels lead to valves MG, OQ, HM +Valve ZI has flow rate=5; tunnels lead to valves BY, ON, RU, LF, JR +Valve IH has flow rate=0; tunnels lead to valves YB, QS +Valve QS has flow rate=22; tunnel leads to valve IH +Valve QB has flow rate=0; tunnels lead to valves QX, ES +Valve NX has flow rate=0; tunnels lead to valves UH, OP +Valve PJ has flow rate=0; tunnels lead to valves OC, UH +Valve OR has flow rate=6; tunnels lead to valves QH, BH, HB, JD +Valve OC has flow rate=7; tunnels lead to valves IZ, JR, TA, ZH, PJ +Valve UC has flow rate=0; tunnels lead to valves AA, BY +Valve QX has flow rate=0; tunnels lead to valves AA, QB +Valve IZ has flow rate=0; tunnels lead to valves OC, SX +Valve AG has flow rate=13; tunnels lead to valves NW, GL, SM +Valve ON has flow rate=0; tunnels lead to valves MO, ZI +Valve XT has flow rate=18; tunnels lead to valves QZ, PG +Valve AX has flow rate=0; tunnels lead to valves UH, MO +Valve JD has flow rate=0; tunnels lead to valves OR, SM +Valve HM has flow rate=0; tunnels lead to valves TX, QH +Valve LF has flow rate=0; tunnels lead to valves ZI, UH +Valve QH has flow rate=0; tunnels lead to valves OR, HM +Valve RT has flow rate=21; tunnel leads to valve PG +Valve NE has flow rate=0; tunnels lead to valves VZ, TA +Valve OQ has flow rate=0; tunnels lead to valves TX, GE +Valve AA has flow rate=0; tunnels lead to valves QZ, UC, OP, QX, EH +Valve UH has flow rate=17; tunnels lead to valves PJ, NX, AX, LF +Valve GE has flow rate=0; tunnels lead to valves YB, OQ +Valve EH has flow rate=0; tunnels lead to valves AA, MO +Valve MG has flow rate=0; tunnels lead to valves TX, NW +Valve YB has flow rate=20; tunnels lead to valves IH, GE, XG +Valve MO has flow rate=15; tunnels lead to valves EH, ON, AX, ZH, CB +Valve JR has flow rate=0; tunnels lead to valves ZI, OC +Valve GL has flow rate=0; tunnels lead to valves AG, QJ +Valve SM has flow rate=0; tunnels lead to valves JD, AG +Valve HB has flow rate=0; tunnels lead to valves OR, QJ +Valve TA has flow rate=0; tunnels lead to valves OC, NE +Valve PG has flow rate=0; tunnels lead to valves RT, XT +Valve XG has flow rate=0; tunnels lead to valves CB, YB +Valve ES has flow rate=9; tunnels lead to valves QB, FL +Valve BH has flow rate=0; tunnels lead to valves RU, OR +Valve FL has flow rate=0; tunnels lead to valves SX, ES +Valve CB has flow rate=0; tunnels lead to valves MO, XG +Valve QZ has flow rate=0; tunnels lead to valves AA, XT +Valve BY has flow rate=0; tunnels lead to valves UC, ZI +Valve ZH has flow rate=0; tunnels lead to valves MO, OC +Valve OP has flow rate=0; tunnels lead to valves NX, AA +Valve NW has flow rate=0; tunnels lead to valves MG, AG +Valve RU has flow rate=0; tunnels lead to valves ZI, BH +Valve SX has flow rate=16; tunnels lead to valves IZ, FL diff --git a/2022/python/day16.py b/2022/python/day16.py new file mode 100644 index 0000000..200b499 --- /dev/null +++ b/2022/python/day16.py @@ -0,0 +1,129 @@ +import sys +import matrix +import shared +import scanf +from dataclasses import dataclass +from typing import List, Dict +from pprint import pprint + + +@dataclass +class Valve: + label: str + rate: int + tunnels: List[str] + opened_at: int = -1 + potential: Dict[str,int] = None + + def set_potential(self, valves): + self.potential = {} + for tunnel in self.tunnels: + self.potential[tunnel] = valves[tunnel].rate + + def highest_potential(self): + return max(self.potential, key=self.potential.get) + +def parse(rows): + valves = {} + for row in rows: + try: + left,right = row.split(" valves ") + except ValueError: + left,right = row.split(" valve ") + valve, rate = scanf.scanf("Valve %s has flow rate=%d; %*s %*s to", left) + if "," in right: + tunnels = right.split(", ") + else: + tunnels = [right,] + valves[valve] = Valve(label=valve,rate=rate,tunnels=tunnels) + + for _,v in valves.items(): + v.set_potential(valves) + return valves + + + +def part1(rows, sample=False): + p1 = Part1(rows,sample, 30) + p1.run() + + +class Part1: + def __init__(self, rows, sample, minutes): + self.rows = rows + self.sample = sample + self.valves = parse(rows) + self.cur = self.valves["AA"] + self.tick = 1 + self.minutes = minutes + + def do_tick(self, minute): + pressure = 0 + opened = [] + for _, valve in self.valves.items(): + if valve.opened_at > 0: + continue + pressure += valve.rate + print(f"== Minute {minute} == [ {self.cur.label} ]") + print(f"\tValves {', '.join(opened)} are open, releasing {pressure} pressure") + + + def open_or_move(self): + #print(self.cur) + hi = self.cur.highest_potential() + potential_elsewhere = self.cur.potential + pe = potential_elsewhere[hi] + if pe > self.cur.rate: + #print(f"should move to {hi}") + self.move(hi) + elif self.cur.rate > pe: + print(f"should open {self.cur.label}") + self.open() + + def move(self, where): + self.tick += 1 + self.cur = self.valves[where] + print("\tMove to valve", where) + + def open(self): + if self.cur.opened_at >= 0 : + raise Exception("tried to open valve already opened") + self.tick += 1 + self.valves[self.cur.label].opened_at = self.tick + self.cur = self.valves[self.cur.label] + print(self.cur) + + def calculate_total_flow(self): + total = 0 + for label, valve in self.valves.items(): + if valve.is_open: + total += valve.rate * (30 - valve.opened_at) + return total + + def run(self): + for minute in range(1, self.minutes+1): + self.do_tick(minute) + self.open_or_move() + + print("total flow:") + print(self.calculate_total_flow()) + + + +def main(): + sample = False + if sys.argv[-1] == "--sample": + sample = True + rows = [row for row in shared.load_rows(16)] + + with shared.elapsed_timer() as elapsed: + part1(rows, sample) + print("🕒", elapsed()) + + #with shared.elapsed_timer() as elapsed: + # part2(rows, sample) + # print("🕒", elapsed()) + + +if __name__ == "__main__": + main() diff --git a/2022/samples/day16.txt b/2022/samples/day16.txt new file mode 100644 index 0000000..9f30acc --- /dev/null +++ b/2022/samples/day16.txt @@ -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