-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
81 lines (61 loc) · 2.12 KB
/
main.py
File metadata and controls
81 lines (61 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import time
import functools
def get_stats(valve):
valve = valve.strip().split("rate=")[1]
rate = int(valve.split(";")[0])
valve = valve.replace("valve ", "valves ").split("valves ")[1]
destinations = valve.split(", ")
return {
"rate": rate,
"destinations": destinations
}
def get_name(valve):
valve = valve.replace("Valve ", "")
valve_id = valve[:valve.index(" ")]
return valve_id
cache = {}
elephant_first = True
def cache_moves(func):
def inner(valves, time, current_valve, opened_valves, who=""):
val = cache.get((time, current_valve, frozenset(opened_valves), who), None)
if val is None:
val = func(valves, time, current_valve, opened_valves, who)
cache[(time, current_valve, frozenset(opened_valves), who)] = val
return val
return inner
@cache_moves
def move(valves, time, current_valve, opened_valves, who=""):
if time == 1:
if who == "human":
return move(valves, 26, "AA", opened_valves, "elephant")
return 0
t = 0
for next_valve in valves[current_valve]["destinations"]:
tmp = move(valves, time-1, next_valve, opened_valves, who)
if tmp >= t:
t = tmp
if valves[current_valve]["rate"] == 0 or current_valve in opened_valves:
return t
tmp_valves = opened_valves.copy()
tmp_valves.add(current_valve)
tmp = move(valves, time-1, current_valve, tmp_valves, who) + valves[current_valve]["rate"] * (time-1)
if tmp >= t:
t = tmp
return t
def main(input_file, stage):
valves = {}
with open(input_file, "r") as f:
valves = {get_name(valve): get_stats(valve) for valve in f.readlines()}
time, who = 30, ""
if stage == 2:
time, who = 26, "human"
print(move(valves, time, "AA", set(), who))
if __name__ == "__main__":
use_example = False
file_name = "example" if use_example else "input"
start = time.time()
main(file_name, 1)
print(f"Stage 1 time: {time.time() - start}")
start = time.time()
main(file_name, 2)
print(f"Stage 2 time: {time.time() - start}")