summaryrefslogtreecommitdiff
path: root/2020/aoc2020-d07.py
diff options
context:
space:
mode:
Diffstat (limited to '2020/aoc2020-d07.py')
-rw-r--r--2020/aoc2020-d07.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/2020/aoc2020-d07.py b/2020/aoc2020-d07.py
new file mode 100644
index 0000000..4be155f
--- /dev/null
+++ b/2020/aoc2020-d07.py
@@ -0,0 +1,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);