76 lines
1.8 KiB
Python
76 lines
1.8 KiB
Python
|
#!/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]))
|