summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d07.py
blob: 4be155f01e662ebcf6c91c526a00c6da03f60304 (plain)
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);