mirror of
https://github.com/RussellChamp/advent-of-code-2022.git
synced 2026-10-27 21:52:30 +00:00
day07 solution
This commit is contained in:
1 parent
90aad38e16
commit
6107f01523
4 files changed
+159
-1
No files matched your search
@@ -0,0 +1,75 @@
|
||||
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
|
||||
Reference in new issue
Block a user