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.

import * as fs from 'fs'

interface Node {size: number, parent?: Node, childs?: {[key: string]: Node}}
const postOrder = (n: Node, func: (n: Node) => any) => {
  Object.values(n.childs || {}).map(c => postOrder(func, c));
  func(n);
}

// build tree
const root: Node = {size: 0, childs: {}}
let curNode: Node = root;
fs.readFileSync(process.argv[2], 'utf-8').split('\n').map(l => {
  const m = l.match(/\S+/g) || [];
  if (m[1] === 'cd') {
    if (m[2] === '/') curNode = root;
    else if (m[2] === '..') curNode = curNode.parent || curNode;
    else curNode = curNode.childs![m[2]];
  }  else if (m[0] === 'dir') {
    curNode.childs![m[1]] = {size: 0, parent: curNode, childs: {}};
  } else if (m[0] !== '$') {
    curNode.childs![m[1]] = {size: Number(m[0]), parent: curNode};
  }
});

// traversal to size folders
postOrder(root, (n: Node) => n.parent && (n.parent.size += n.size));
// traversal to find best folder
const sizeReq = 30000000 - (70000000 - root.size)
let minSize = root.size;
postOrder(root,
  (n: Node) => n.childs && sizeReq <= n.size && n.size < minSize && (minSize = n.size),
);

console.log(minSize); 
Jump in the discussion.

No email address required.

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