diff --git a/7/nospaceleft.py b/7/nospaceleft.py index 1585711..2d6d92a 100644 --- a/7/nospaceleft.py +++ b/7/nospaceleft.py @@ -1,24 +1,24 @@ -from collections import defaultdict - from aocd.models import Puzzle from aocd import submit + def get_sizes_a(dirs: dict, max_size: int) -> int: """ return the size of all dirs which are at most max_size big """ - filtered_dirs = [ value for value in dirs.values() if value < max_size] + filtered_dirs = [value for value in dirs.values() if value < max_size] return sum(filtered_dirs) + def get_sizes_b(dirs: dict, needed_size: int) -> int: """ return the smallest size of a dir which when deleted amounts to the needed size of 30M. """ total_size = 70000000 - used_size = dirs[('/',)] + used_size = dirs[("/",)] max_free = needed_size - (total_size - used_size) - filtered_dirs = [ value for value in dirs.values() if value > max_free] + filtered_dirs = [value for value in dirs.values() if value > max_free] return min(filtered_dirs) @@ -34,25 +34,27 @@ def parse_input(input_str: str) -> list: available information in the following dictionary. - {list['/','dir','path']:int(size_sum)} """ - path = [] - dirs = defaultdict(int) + path = list() + dirs = dict() for line in input_str.splitlines(): match line.split(): - case ('$', 'cd', '..'): + case ("$", "cd", ".."): path.pop() - case ('$', 'cd', name): + case ("$", "cd", name): path.append(name) - case ('$', 'ls'): + case ("$", "ls"): continue - case ('dir', _): + case ("dir", _): continue case (size, file): size = int(size) for i in range(len(path)): - key = tuple(path[:i+1]) # list not hashable - dirs[key] += size + key = tuple(path[: i + 1]) # list not hashable + dirs.setdefault(key, 0) # initialize key for += to work + dirs[key] += size # dirs needs to be initialized return dirs + if __name__ == "__main__": # get puzzle and parse data puzzle = Puzzle(year=2022, day=7)