From 1ea592b42e879b1ad5985d7b951237ea7f636e58 Mon Sep 17 00:00:00 2001 From: aaron Date: Thu, 8 Dec 2022 00:15:32 +0100 Subject: [PATCH] kind of solve part a --- 7/nospaceleft.py | 56 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/7/nospaceleft.py b/7/nospaceleft.py index 95f7da7..2b75ca6 100644 --- a/7/nospaceleft.py +++ b/7/nospaceleft.py @@ -1,36 +1,58 @@ +from collections import defaultdict + from aocd.models import Puzzle from aocd import submit -def get_size(commands: list, dirs: list, size: int) -> int: +def get_sizes(dirs: dict, max_size: int) -> int: """ - parse tree structure and get size of all files > size + gather all filesizes from the input """ - print(commands) - print(dirs) - print(size) + filtered_dirs = [ value for value in dirs.values() if value < max_size] + return sum(filtered_dirs) - return 0 - - -def parse_input(data: str) -> (list,list): +def parse_input(input_str: str) -> list: """ - parse input data + the input string consists of the following four message types + - $ cd .. -> pop dir name from stack + - $ cd [dir] -> push dir name to stack + - $ ls -> ignore + - dir [dir] -> ignore + - [size] [file] -> sum up the sizes of all files in this dir + parsing is done by implementing a state machine which gathers all + available information in the following dictionary. + - {list['/','dir','path']:int(size_sum)} """ - return ([],[]) - + path = [] + dirs = defaultdict(int) + for line in input_str.splitlines(): + match line.split(): + case ('$', 'cd', '..'): + path.pop() + case ('$', 'cd', name): + path.append(name) + case ('$', 'ls'): + continue + 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 + return dirs if __name__ == "__main__": # get puzzle and parse data puzzle = Puzzle(year=2022, day=7) - commands, dirs = parse_input(puzzle.input_data) + dirs = parse_input(puzzle.input_data) - # part a: - answer_a = get_size(commands, dirs, 1000) + # part a: get the sum of all dirs where the size is at most 100k + answer_a = get_sizes(dirs, 100000) print(f"{answer_a}") - #submit(answer_a, part="a", day=7, year=2022) + submit(answer_a, part="a", day=7, year=2022) # part b: - answer_b = get_size(commands, dirs, 10000) + answer_b = get_sizes(dirs, 100) print(f"{answer_b}") #submit(answer_b, part="b", day=7, year=2022)