adventofcode2020/7/7.py

76 lines
1.8 KiB
Python
Executable File

#!/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]))