58 lines
1.2 KiB
Python
58 lines
1.2 KiB
Python
|
def find_all_paths(graph, start, end, path =[]):
|
||
|
path = path + [start]
|
||
|
if start == end:
|
||
|
return [path]
|
||
|
if start == '':
|
||
|
return []
|
||
|
paths = []
|
||
|
for node in graph[start]:
|
||
|
if node not in path:
|
||
|
newpaths = find_all_paths(graph, node, end, path)
|
||
|
for newpath in newpaths:
|
||
|
paths.append(newpath)
|
||
|
return paths
|
||
|
|
||
|
with open("input.txt","r") as f:
|
||
|
rules = (f
|
||
|
.read()
|
||
|
.replace("bags","")
|
||
|
.replace("bag","")
|
||
|
.replace("no other","")
|
||
|
.replace(".","")
|
||
|
.replace(" ","")
|
||
|
.split('\n')
|
||
|
)
|
||
|
rules = [rule.split("contain") for rule in rules]
|
||
|
graph = {}
|
||
|
for rule in rules:
|
||
|
key = rule[0]
|
||
|
values = rule[1].split(',')
|
||
|
values = [value[1:] for value in values]
|
||
|
graph[key] = values
|
||
|
part1 = 0
|
||
|
for key in graph:
|
||
|
if key == "shinygold":
|
||
|
continue
|
||
|
if paths := find_all_paths(graph,key,"shinygold"):
|
||
|
part1 += 1
|
||
|
print(part1)
|
||
|
|
||
|
graph = {}
|
||
|
def numsplit(s):
|
||
|
if s == '':
|
||
|
return ('0', '')
|
||
|
return (s[0], s[1:])
|
||
|
for rule in rules:
|
||
|
key = rule[0]
|
||
|
values = rule[1].split(',')
|
||
|
values = [numsplit(value) for value in values]
|
||
|
graph[key] = values
|
||
|
def add_bags(key):
|
||
|
total = 0
|
||
|
if key == '':
|
||
|
return total
|
||
|
for num, color in graph[key]:
|
||
|
total += int(num) * (1 + add_bags(color))
|
||
|
return total
|
||
|
part2 = add_bags("shinygold")
|
||
|
print(part2)
|