From 378b5e38aec5048b64d33080aa667a73b6945236 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 7 Dec 2022 14:27:54 +0100 Subject: [PATCH] [py] Solve 2022_07 --- py/aoc/__init__.py | 3 ++- py/aoc/y2022/d07.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 py/aoc/y2022/d07.py diff --git a/py/aoc/__init__.py b/py/aoc/__init__.py index f604c33..47b2c84 100644 --- a/py/aoc/__init__.py +++ b/py/aoc/__init__.py @@ -8,7 +8,7 @@ from .y2017 import d01, d02, d03, d04, d05, d06, d07, d08, d09 from .y2018 import d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11 from .y2020 import d10 from .y2021 import d14 -from .y2022 import d01, d02, d03, d04, d05, d06 +from .y2022 import d01, d02, d03, d04, d05, d06, d07 DAYS = { "2015_01": y2015.d01.solve, @@ -49,6 +49,7 @@ DAYS = { "2022_04": y2022.d04.solve, "2022_05": y2022.d05.solve, "2022_06": y2022.d06.solve, + "2022_07": y2022.d07.solve, } diff --git a/py/aoc/y2022/d07.py b/py/aoc/y2022/d07.py new file mode 100644 index 0000000..566c96e --- /dev/null +++ b/py/aoc/y2022/d07.py @@ -0,0 +1,43 @@ +def at(fs, path): + for segment in path: + fs = fs[segment] + return fs + + +def calc_size(fs): + if isinstance(fs, dict): + return sum(calc_size(child) for child in fs.values()) + return fs + + +def dict_sizes(fs): + result = [] + if isinstance(fs, dict): + result.append(calc_size(fs)) + for child in fs.values(): + result.extend(dict_sizes(child)) + return result + + +def solve(inputstr): + fs = {} + path = [] + for line in inputstr.splitlines(): + if line == "$ cd /": + path = [] + elif line == "$ cd ..": + path.pop() + elif line[:5] == "$ cd ": + path.append(line[5:]) + elif line == "$ ls": + pass + elif line[:4] == "dir ": + at(fs, path)[line[4:]] = {} + else: + size, name = line.split() + at(fs, path)[name] = int(size) + + sizes = dict_sizes(fs) + print("Part 1:", sum(size for size in sizes if size <= 100000)) + min_size = calc_size(fs) - 40000000 + print(f"Part 2:", min(size for size in sizes if size >= min_size))