Unable to load image

Advent of Code 2022: Day 7

https://adventofcode.com
with open('AdventOfCode2022/input.txt', 'r') as input:
    commands = input.read().split('\n')

    def new_dict(name, parent=None):
        return {
        'name': name,
        'parent':parent,
        'files': 0,
        'dirs': {}
    }

    root_dict = new_dict(name='/', parent=None)
    curr_dict = root_dict

    #Build tree of dicts
    for i in range(len(commands)):
        command_parts = commands[i].split(' ')
        if command_parts[0] == '$':
            if command_parts[1] == 'cd':
                if command_parts[2] == '..':
                    curr_dict = curr_dict['parent']
                elif command_parts[2] == '/':
                    pass
                else:
                    curr_dict = curr_dict['dirs'][command_parts[2]]
        elif command_parts[0] == 'dir':
            if command_parts[1] not in curr_dict:
                curr_dict['dirs'][command_parts[1]] = new_dict(name=command_parts[1], parent=curr_dict)
        elif command_parts[0] == '':
            pass
        else:
            curr_dict['files'] += int(command_parts[0])

    #PART ONE

    MAX_THRESHOLD = 100000
    FINAL_COUNTER = 0
    dict_list = []
    
    def parse_dict(t_dict):
        folder_total = t_dict['files']

        for c_dict in t_dict['dirs'].keys():
            folder_total += parse_dict(t_dict['dirs'][c_dict])

        global dict_list
        dict_list.append(folder_total)

        if folder_total < MAX_THRESHOLD:
            global FINAL_COUNTER # this is the most embarrassing thing I've ever done
            FINAL_COUNTER += folder_total
        return folder_total

    total_used = parse_dict(root_dict)
    print(FINAL_COUNTER)

    #PART TWO
    TOTAL_SPACE = 70000000
    WANTED_SPACE = 30000000
    curr_wanted = WANTED_SPACE - (TOTAL_SPACE - total_used)
    
    larger_than_wanted = []
    for i in dict_list:
        if i > curr_wanted:
            larger_than_wanted.append(i)

    print(min(larger_than_wanted))
32
Jump in the discussion.

No email address required.

APLchads.... :marseydisintegrate:

from collections import defaultdict

def size(f: tuple[str]) -> int:
    return sum(x if isinstance(x, int) else size(f+(x,)) for x in dirs[f])

with open('7', 'r') as file:
    raw = file.read().strip().split('\n')
dirs = defaultdict(list)
loc = []
for line in raw:
    match line.split():
        case ['$', 'cd', '..']:
            loc.pop(-1)
        case ['$', 'ls']:
            continue
        case ['$', 'cd', newloc]:
            loc.append(newloc)
        case ['dir', subfolder]:
            dirs[tuple(loc)].append(subfolder)
        case [filesize, *x]:
            dirs[tuple(loc)].append(int(filesize))
sizes = {k: size(k) for k in dirs}
to_remove = sizes[tuple('/')] - 40000000
a = sum(x for x in sizes.values() if x <= 100000)
b = min(x for x in sizes.values() if x >= to_remove)
print(f'Day 7: {a} {b}')
Jump in the discussion.

No email address required.

Link copied to clipboard
Action successful!
Error, please refresh the page and try again.