#[path = "../lib.rs"] mod lib; use std::collections::HashMap; fn main() { let mut path = vec![]; let mut dirs: HashMap = HashMap::new(); for line in lib::iter_input() { match line.split(' ').collect::>()[..] { ["$", "ls"] => {}, ["$", "cd", "/"] => { path = vec![]; }, ["$", "cd", ".."] => { path.pop(); }, ["$", "cd", name] => { path.push(name.to_string()); }, ["dir", _name] => {}, [n, _name] => { let size = n.parse::().unwrap(); for i in 0..=path.len() { let p = path[0..i].join("/"); dirs.entry(p).and_modify(|old| *old += size).or_insert(size); } }, _ => unreachable!(), } } let free = 70000000 - dirs[""]; println!("part1: {}", dirs.values().filter(|x| **x <= 100000).sum::()); println!("part2: {}", dirs.values().filter(|x| free + **x >= 30000000).min().unwrap()); }