diff --git a/day7/src/main.rs b/day7/src/main.rs index 618e200..798fe5d 100644 --- a/day7/src/main.rs +++ b/day7/src/main.rs @@ -1,5 +1,6 @@ -use std::{fs::read_to_string, iter::Peekable, str::Lines}; +use std::{collections::HashMap, fs::read_to_string, iter::Peekable, str::Lines}; +/* #[derive(PartialEq, Debug)] struct File { name: String, @@ -115,3 +116,68 @@ fn main() { let sol2 = sizes.filter(|s| s >= &additional).min().unwrap(); println!("Deleting Directory with size {sol2}"); } +*/ + +fn main() { + let input = read_to_string("input.txt").unwrap(); + let mut cwd = "/".to_owned(); + let mut files = HashMap::new(); + for line in input.lines() { + let line = line.split_whitespace().collect::>(); + match line.len() { + 3 => match line[2] { + "/" => cwd = "/".to_owned(), + ".." => { + cwd = { + if cwd == "/" { + cwd + } else { + let dirs = cwd.split_inclusive('/').collect::>(); + let nwd = dirs[..(dirs.len() - 1)] + .iter() + .fold(String::new(), |s, v| s + v); + nwd + } + } + } + dir => cwd = cwd + dir + "/", + }, + 2 => { + if (line[0] != "$") && (line[0] != "dir") { + let size = line[0].parse::().unwrap(); + let path = cwd.clone() + line[1]; + files.insert(path, size); + } + } + _ => (), + } + } + let mut directories = HashMap::new(); + for (path, size) in files { + let mut folders = path + .split_terminator('/') + .map(|s| s.to_owned()) + .collect::>(); + folders.pop(); + for (index, folder) in folders.clone().iter().enumerate() { + let previus = if index > 0 { &folders[index - 1] } else { "" }; + folders[index] = previus.to_owned() + folder + "/"; + } + for folder in folders { + *directories.entry(folder).or_insert(0) += size; + } + } + let result1: usize = directories.values().filter(|&&size| size < 100_000).sum(); + const TOTAL_SPACE: usize = 70000000; + const NEEDED_FREE: usize = 30000000; + let used = *directories.entry("/".to_owned()).or_insert(0); + let free = TOTAL_SPACE - used; + let additional = NEEDED_FREE - free; + let result2: usize = directories + .values() + .filter(|&&size| size >= additional) + .min() + .map(|size| *size) + .unwrap_or(0); + println!("{result1} bytes used by directories smaller than 100000. {result2} Bytes removed by the smallest directory"); +}