Advent of Code 2022 Day 7: No Space Left On Device Solutions

Advent of Code 2022 Day 7: No Space Left On Device Solutions

It's day 7 of the AoC and here is my solution to the No Space Left On Device puzzle:

with open('input', 'r') as file:
    input = list(file.read().split('\n'))
class Directory:
    def __init__(self, name, parent=None) -> None:
        self.name = name
        self.parent = parent
        self.files = []
        self.sub_dirs = []

    def size(self):
        files_size = sum(self.files)
        dirs_size = sum(map(lambda x: x.size(), self.sub_dirs))

        return files_size + dirs_size
    
    def find_dir(self, name):
        dirs = list(filter(lambda x: x.name == name, self.sub_dirs))
        if len(dirs) > 0:
            return dirs[0]
        else:
            return None

directories = []

def solution_1():
    current_dir = None

    for cmd in input:
        if cmd.startswith("dir") or cmd.startswith("$ ls"):
            continue
        elif cmd.startswith("$ cd"):
            parts = cmd.split(' ')

            if current_dir == None:
                current_dir = Directory('/')
                directories.append(current_dir)

            if parts[2] == "..":
                current_dir = current_dir.parent
            else:
                looked_dir = current_dir.find_dir(parts[2])

                if looked_dir == None:
                    new_dir = Directory(parts[2], current_dir)
                    current_dir.sub_dirs.append(new_dir)
                    directories.append(new_dir)

                    current_dir = new_dir
                else:
                    current_dir = looked_dir
        else:
            current_dir.files.append(int(cmd.split(' ')[0]))

    del directories[0]

    return sum(filter(lambda y: y < 100000, map(lambda x: x.size(), directories)))

def solution_2():
    MAX_SPACE = 70_000_000
    NEEDED_SPACE = 30_000_000

    root_space = directories[0].size()
    free_space = MAX_SPACE - root_space
    required_space = NEEDED_SPACE - free_space

    dirs_sorted = list(sorted(map(lambda x: x.size(), directories)))

    return list(filter(lambda x: x >= required_space, dirs_sorted))[0]


def main():
    print("First part answer is: " + str(solution_1()))
    print("Second part answer is: " + str(solution_2()))


if __name__ == "__main__":
    main()

You can find the whole code here: https://github.com/Seishin/AoC2022

Happy coding! 👨‍💻