advent-of-code/2022/day7/rust/src/main.rs

63 lines
1.6 KiB
Rust
Raw Normal View History

2022-12-07 06:29:48 +01:00
#![warn(clippy::pedantic)]
2022-12-07 19:16:30 +01:00
use std::{collections::HashMap, io::stdin, path::PathBuf};
2022-12-07 06:29:48 +01:00
2022-12-07 19:16:30 +01:00
use aoc::PathExt;
2022-12-07 06:29:48 +01:00
2022-12-07 19:16:30 +01:00
fn find_dir_to_delete(dirs: &HashMap<PathBuf, usize>) -> usize {
const TOTAL_SPACE: usize = 70_000_000;
const REQUIRED_SPACE: usize = 30_000_000;
let unused = TOTAL_SPACE - dirs[&*PathBuf::from("/")];
let to_free = REQUIRED_SPACE - unused;
let mut sizes: Vec<_> = dirs.values().copied().collect();
sizes.sort_unstable();
match sizes.binary_search(&to_free) {
Ok(i) | Err(i) => sizes[i],
}
}
2022-12-07 06:29:48 +01:00
2022-12-07 19:16:30 +01:00
fn main() {
2022-12-07 06:29:48 +01:00
let mut cwd = PathBuf::new();
cwd.push("/");
let mut dirs: HashMap<PathBuf, usize> = HashMap::new();
2022-12-07 19:16:30 +01:00
for line in stdin().lines() {
let line = line.unwrap();
2022-12-07 06:29:48 +01:00
if let Some(command) = line.strip_prefix("$ ") {
let mut args = command.split_whitespace();
2022-12-07 19:16:30 +01:00
if args.next().unwrap() != "cd" {
continue;
}
match args.next().unwrap() {
".." => assert!(cwd.pop()),
path => {
cwd.push(path);
assert!(!dirs.contains_key(&cwd));
2022-12-07 06:29:48 +01:00
}
}
} else {
2022-12-07 19:16:30 +01:00
let size = line.split_whitespace().next().unwrap();
2022-12-07 06:29:48 +01:00
if size == "dir" {
2022-12-07 19:16:30 +01:00
continue;
2022-12-07 06:29:48 +01:00
}
2022-12-07 19:16:30 +01:00
let size: usize = size.parse().unwrap();
for dir in cwd.parents() {
*dirs.entry(dir.to_path_buf()).or_default() += size;
}
2022-12-07 06:29:48 +01:00
}
}
println!(
"{}",
2022-12-07 19:16:30 +01:00
dirs.values().filter(|&&s| s <= 100_000).sum::<usize>()
2022-12-07 06:29:48 +01:00
);
2022-12-07 19:16:30 +01:00
println!("{}", find_dir_to_delete(&dirs));
2022-12-07 06:29:48 +01:00
}