mirror of
https://github.com/RussellChamp/advent-of-code-2022.git
synced 2026-10-27 21:52:30 +00:00
75 lines
2.4 KiB
Python
75 lines
2.4 KiB
Python
class PathNode:
|
|||
|
|
def __init__(self, name, size = 0):
|
||
|
|
self.name = name
|
||
|
|
self.size = size
|
||
|
|
self.parent = None
|
||
|
|
self.children = {}
|
||
|
|
|
||
|
|
def has_parent(self):
|
||
|
|
# print('%s has a parent? %s' % (self.name, self.parent is not None))
|
||
|
|
return self.parent is not None
|
||
|
|
|
||
|
|
def set_parent(self, parent):
|
||
|
|
self.parent = parent
|
||
|
|
|
||
|
|
def has_child(self, name):
|
||
|
|
# print('%s has child %s? %s' % (self.name, name, self.children.has_key(name)))
|
||
|
|
return self.children.has_key(name)
|
||
|
|
|
||
|
|
def add_child(self, name, size = 0):
|
||
|
|
# print('+ adding %s to %s' % (name, self.name))
|
||
|
|
self.children[name] = PathNode(name, size)
|
||
|
|
self.children[name].set_parent(self)
|
||
|
|
self.size += size
|
||
|
|
|
||
|
|
ptr = self
|
||
|
|
while ptr.has_parent():
|
||
|
|
ptr = ptr.parent
|
||
|
|
ptr.size += size
|
||
|
|
|
||
|
|
def is_directory(self):
|
||
|
|
return len(self.children) > 0
|
||
|
|
|
||
|
|
def print_self(self, indentation = 0):
|
||
|
|
size = '(%d)' % (self.size) + (' [%d items]' % (len(self.children)) if self.is_directory() else '')
|
||
|
|
print('%s%s %s' % (' ' * indentation, self.name, size))
|
||
|
|
for key in self.children:
|
||
|
|
self.children[key].print_self(indentation+1)
|
||
|
|
|
||
|
|
def go_up_one_level(self):
|
||
|
|
if self.has_parent():
|
||
|
|
# print('-> moved up one level from %s to %s' % (self.name, self.parent.name))
|
||
|
|
return self.parent
|
||
|
|
return self
|
||
|
|
|
||
|
|
def go_to_root(self):
|
||
|
|
if self.has_parent():
|
||
|
|
# print('-> going to root from %s' % (self.name))
|
||
|
|
return self.parent.go_to_root()
|
||
|
|
return self
|
||
|
|
|
||
|
|
def go_to_child(self, name):
|
||
|
|
if self.has_child(name):
|
||
|
|
# print('-> going to %s from %s' % (name, self.name))
|
||
|
|
return self.children[name]
|
||
|
|
return self
|
||
|
|
|
||
|
|
def get_directories_le(self, size):
|
||
|
|
dirs = []
|
||
|
|
for key in filter(lambda c: self.children[c].is_directory(), self.children):
|
||
|
|
if self.children[key].size <= size:
|
||
|
|
dirs.append([self.children[key].name, self.children[key].size])
|
||
|
|
dirs += self.children[key].get_directories_le(size)
|
||
|
|
return dirs
|
||
|
|
|
||
|
|
def iterate_all_directories(self):
|
||
|
|
dirs = [[self.name, self.size]]
|
||
|
|
for key in self.children:
|
||
|
|
dirs += self.children[key].iterate_all_directories()
|
||
|
|
return dirs
|
||
|
|
|
||
|
|
def find_smallest_at_least(self, required_size):
|
||
|
|
all_dirs = self.iterate_all_directories()
|
||
|
|
adequate_size_dirst = filter(lambda item: item[1] >= required_size, all_dirs)
|
||
|
|
smallest_dir = min(adequate_size_dirst, key=lambda item: item[1])
|
||
|
|
return smallest_dir
|