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
|
#advent of code 2020
#day 07
#cool
PuzzleInput = open("07.in","r");
rules = {};
target = "shinygold";
queue = [];
options = set();
#parse, removing filler wording and splitting bag names to dictionary
for line in PuzzleInput:
line = line.replace("\n","").replace(" bags","").replace(" bag","").replace("no other","1 no other")[:-1];
rk, rv = line.split(" contain "); #rule key, rule value
rv = rv.split(", ");
rk = rk.replace(" ","");
rules[rk] = dict();
for rval in rv:
rv1,rv2,rv3 = rval.split(" ");
rules[rk][rv2+rv3] = int(rv1);
if target in rules[rk]:
queue.append(rk);
options.add(rk);
PuzzleInput.close();
#part 1
visited = [];
while queue:
bag = queue.pop();
if bag in visited: continue;
visited.append(bag);
for rk in rules:
if bag in rules[rk]:
queue.append(rk);
options.add(rk);
p1 = len(options);
#part 2
queue = [(1,target)];
AllBags = dict();
while queue:
total, bag = queue.pop();
for b in rules[bag]:
if b == "noother": continue;
AllBags[b] = AllBags.get(b,0) + total*rules[bag][b];
queue.append((total*rules[bag][b], b));
p2 = sum([AllBags[bag] for bag in AllBags]);
print("part 1 =",p1);
print("part 2 =",p2);
|