diff --git a/rust/day7/src/main.rs b/rust/day7/src/main.rs index 7982e71..0b647a5 100644 --- a/rust/day7/src/main.rs +++ b/rust/day7/src/main.rs @@ -1,5 +1,7 @@ +use std::cmp; use std::fs::read_to_string; mod system; +use system::Directory; use system::Disk; fn decode(cmd: Vec<&str>) -> Disk { @@ -30,7 +32,7 @@ fn decode(cmd: Vec<&str>) -> Disk { disk } -fn list_dirs(disk: &Disk, max: u64) -> u64 { +fn first_part(disk: &Disk, max: u64) -> u64 { let mut sum = 0; for iter in disk .get_directories() @@ -47,9 +49,30 @@ fn list_dirs(disk: &Disk, max: u64) -> u64 { sum } +fn second_part(disk: &Disk, disk_space: u64, update_space: u64) { + let directories = disk.get_directories(); + let needed_space = update_space - (disk_space - disk.get_size(directories[0])); + println!("Needed space: {}", needed_space); + let big_directories: Vec<&&Directory> = directories + .iter() + .filter(|dir| disk.get_size(dir) >= needed_space) + .collect(); + let (_, dir) = big_directories + .iter() + .enumerate() + .min_by(|(_, a), (_, b)| disk.get_size(a).cmp(&disk.get_size(b))) + .unwrap(); + println!( + "Directory to delete : {},\twith size: {}", + disk.get_path(dir), + disk.get_size(dir) + ); +} + fn main() { let file_content = read_to_string("input").unwrap(); let final_disk = decode(file_content.split("\n").collect()); final_disk.print(); - println!("Total sum: {}", list_dirs(&final_disk, 100000)); + println!("Total sum: {}", first_part(&final_disk, 100000)); + second_part(&final_disk, 70000000, 30000000); }