from day07.common import BaseGraph import datetime class Graph(BaseGraph): def depth_first_search(self, start: str, search_contained_by: bool = False, use_cache=True): visited = [] def count_bags(nxt): if nxt not in self._nodes: return 0 node = self._nodes[nxt] if not use_cache: node.visited = False node.count = 0 if node.visited: return node.count node.visited = True visited.append(node) iter_over = node.contained_by if search_contained_by else node.contains cnt = sum(val*count_bags(key) for key, val in iter_over.items()) + 1 node.count = cnt return cnt overall_cnt = count_bags(start) for visit in visited: visit.visited = False visit.count = 0 return overall_cnt graph = Graph() lines = (x.strip() for x in open("input.txt")) count = -1 for line in lines: graph.add_line(line) a = datetime.datetime.now() count = graph.depth_first_search("shiny gold", search_contained_by=False) - 1 b = datetime.datetime.now() - a print("With dyn programming", b) print(count) a = datetime.datetime.now() count = graph.depth_first_search("shiny gold", search_contained_by=False, use_cache=False) - 1 b = datetime.datetime.now() - a print("Without dyn programming", b) print(count)