diff options
Diffstat (limited to '2020/aoc2020-d07.py')
| -rw-r--r-- | 2020/aoc2020-d07.py | 48 |
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); |
