#!/usr/bin/env python3 from random import randrange import sys L = [] with open(sys.argv[1], 'r') as f: L = f.readlines() L = [x.strip() for x in L] bags = {} for rule in L: rL = rule.split(' bags contain ') outerbag = rL[0] innerbags = rL[1].split(', ') innerbagsD = {} for bag in innerbags: if bag == 'no other bags.': continue bagL = bag.split(' ') bagNum = int(bagL[0]) bagStr = ' '.join((bagL[1], bagL[2])) innerbagsD[bagStr] = bagNum bags[outerbag] = innerbagsD # part 1 BAGS = set() mybag = 'shiny gold' def countbags(bags, mybag): for bag in bags: if mybag in bags[bag]: global BAGS BAGS.add(bag) countbags(bags, bag) countbags(bags, mybag) #print(len(BAGS)) # part 2 betterbags = {} for outerbag in bags: betterbags[outerbag] = {} for innerbag in bags[outerbag]: betterbags[outerbag][innerbag] = {'count': bags[outerbag][innerbag]} mybag = 'shiny gold' mybags = {'shiny gold': {'count': 1}} def buildmybag(mybags, mybag): global betterbags if isinstance(betterbags[mybag], int): mybags[mybag] = {'count': betterbags[mybag]} else: mybags[mybag].update(betterbags[mybag]) for bag in mybags[mybag]: if bag != 'count': buildmybag(mybags[mybag], bag) buildmybag(mybags, mybag) #print(mybags) def countmybags(mybags): totalbags = 0 for bag in mybags: if bag == 'count': # solution: run once with this uncommented, then run again with it commented out, subtract 2nd number from first then subtract 1 from the result # totalbags = (totalbags * mybags['count']) + mybags['count'] continue totalbags += mybags['count'] + mybags['count'] * countmybags(mybags[bag]) return totalbags print(countmybags(mybags[mybag]))