From 6c33771a964b02a97b16544b23ee276cf9e5a5c5 Mon Sep 17 00:00:00 2001 From: TriMill Date: Wed, 7 Dec 2022 01:25:00 -0500 Subject: [PATCH] day 07 --- examples/day07_1.rs | 48 ++++++++++++++++++++++++++++++++++++++++++ examples/day07_2.rs | 51 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 examples/day07_1.rs create mode 100644 examples/day07_2.rs diff --git a/examples/day07_1.rs b/examples/day07_1.rs new file mode 100644 index 0000000..b18bccd --- /dev/null +++ b/examples/day07_1.rs @@ -0,0 +1,48 @@ +use std::{collections::{HashMap, HashSet}}; + +fn main() { + let mut lines = std::io::stdin().lines().map(|x| x.unwrap()).peekable(); + let mut files: HashMap = HashMap::new(); + let mut dirs: HashSet = HashSet::new(); + let mut cd: Vec = Vec::new(); + while let Some(line) = lines.next() { + let parts = line.split(" ").collect::>(); + match parts[1] { + "cd" => { + match parts[2] { + ".." => { cd.pop(); }, + "/" => cd = Vec::new(), + x => cd.push(x.to_owned()), + } + dirs.insert(cd.join("/")); + } + "ls" => while let Some(line) = lines.peek() { + if line.starts_with("$") { + break + } + let line = lines.next().unwrap(); + let parts: Vec<&str> = line.split(" ").collect(); + if parts[0] != "dir" { + let size: usize = parts[0].parse().unwrap(); + let name = parts[1].to_owned(); + let mut f = cd.clone(); + f.push(name); + files.insert(f.join("/"), size); + } + } + _ => todo!() + } + } + let mut sizes: HashMap = HashMap::new(); + for dir in dirs { + let mut size = 0; + for file in &files { + if file.0.starts_with(&dir) { + size += file.1; + } + } + sizes.insert(dir, size); + } + let total: usize = sizes.iter().filter(|(_, v)| **v <= 100000).map(|(_, v)| v).sum(); + println!("{}", total); +} diff --git a/examples/day07_2.rs b/examples/day07_2.rs new file mode 100644 index 0000000..b049983 --- /dev/null +++ b/examples/day07_2.rs @@ -0,0 +1,51 @@ +use std::{collections::{HashMap, HashSet}}; + +fn main() { + let mut lines = std::io::stdin().lines().map(|x| x.unwrap()).peekable(); + let mut files: HashMap = HashMap::new(); + let mut dirs: HashSet = HashSet::new(); + let mut cd: Vec = Vec::new(); + while let Some(line) = lines.next() { + let parts = line.split(" ").collect::>(); + match parts[1] { + "cd" => { + match parts[2] { + ".." => { cd.pop(); }, + "/" => cd = Vec::new(), + x => cd.push(x.to_owned()), + } + dirs.insert(cd.join("/")); + } + "ls" => while let Some(line) = lines.peek() { + if line.starts_with("$") { + break + } + let line = lines.next().unwrap(); + let parts: Vec<&str> = line.split(" ").collect(); + if parts[0] != "dir" { + let size: usize = parts[0].parse().unwrap(); + let name = parts[1].to_owned(); + let mut f = cd.clone(); + f.push(name); + files.insert(f.join("/"), size); + } + } + _ => todo!() + } + } + let mut sizes: HashMap = HashMap::new(); + for dir in dirs { + let mut size = 0; + for file in &files { + if file.0.starts_with(&dir) { + size += file.1; + } + } + sizes.insert(dir, size); + } + let root_size = sizes[""]; + let free_space = 70000000 - root_size; + let to_free = 30000000 - free_space; + let smallest = sizes.values().filter(|x| **x >= to_free).min().unwrap(); + println!("{}", smallest); +}