Day 07
This commit is contained in:
@ -1,18 +1,68 @@
|
||||
use crate::read;
|
||||
use itertools::Itertools;
|
||||
use tuple_map::*;
|
||||
use indextree::Arena;
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Directory {
|
||||
pub size: usize,
|
||||
pub name: String
|
||||
}
|
||||
|
||||
pub fn run() {
|
||||
let input = read("04");
|
||||
let lines = input.lines();
|
||||
let lines = input.split("\n\n");
|
||||
let arena = &mut Arena::new();
|
||||
let mut current_directory = arena.new_node(Directory {
|
||||
size: 0,
|
||||
name: "/".into(),
|
||||
});
|
||||
let root = current_directory;
|
||||
|
||||
for line in read("07").lines().skip(1) {
|
||||
if line.starts_with("$ cd") {
|
||||
current_directory = match line.split_once("cd ").unwrap().1 {
|
||||
dirname if ".." == dirname => current_directory.ancestors(arena).nth(1).unwrap(),
|
||||
dirname => current_directory
|
||||
.children(arena)
|
||||
.find(|c|arena.get(*c).unwrap().get().name == dirname)
|
||||
.unwrap_or_else(||{
|
||||
let nc = arena.new_node(Directory {
|
||||
size: 0,
|
||||
name: dirname.into(),
|
||||
});
|
||||
current_directory.append(nc, arena);
|
||||
nc
|
||||
})
|
||||
};
|
||||
} else if line.chars().next().unwrap().is_numeric() {
|
||||
let filesize: usize = line.split_once(" ").unwrap().0.parse().unwrap();
|
||||
arena.get_mut(current_directory).unwrap().get_mut().size += filesize;
|
||||
}
|
||||
}
|
||||
let total = root.descendants(arena).map(|desc|{
|
||||
desc
|
||||
.descendants(arena)
|
||||
.map(|d|arena.get(d).unwrap().get().size)
|
||||
.sum::<usize>()
|
||||
}).collect::<Vec<_>>();
|
||||
|
||||
#[cfg(feature = "part1")]
|
||||
{
|
||||
println!("Day 7, Part 01: {}", "TODO");
|
||||
println!("Day 7, Part 01: {}", total.clone().iter()
|
||||
.filter(|s| *s <= &100000)
|
||||
.sum::<usize>());
|
||||
}
|
||||
|
||||
#[cfg(feature = "part2")]
|
||||
{
|
||||
println!("Day 7, Part 02: {}", "TODO");
|
||||
let total_used = root.descendants(arena)
|
||||
.map(|d|arena.get(d).unwrap().get().size)
|
||||
.sum::<usize>();
|
||||
let free_needed = total_used - 40000000;
|
||||
|
||||
println!("Day 7, Part 02: {}", total.iter()
|
||||
.filter(|s|*s >= &free_needed)
|
||||
.sorted()
|
||||
.next()
|
||||
.unwrap());
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user