Day 07
This commit is contained in:
parent
3cca0097ed
commit
cb204b8d62
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -25,6 +25,7 @@ name = "aoc-2022"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"indextree",
|
||||||
"itertools",
|
"itertools",
|
||||||
"regex",
|
"regex",
|
||||||
"tuple-map",
|
"tuple-map",
|
||||||
@ -159,6 +160,12 @@ dependencies = [
|
|||||||
"cxx-build",
|
"cxx-build",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indextree"
|
||||||
|
version = "4.5.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "497f036ac2fae75c34224648a77802e5dd4e9cfb56f4713ab6b12b7160a0523b"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itertools"
|
name = "itertools"
|
||||||
version = "0.10.5"
|
version = "0.10.5"
|
||||||
|
@ -7,6 +7,7 @@ edition = "2021"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
chrono = "0.4.23"
|
chrono = "0.4.23"
|
||||||
|
indextree = "4.5.0"
|
||||||
itertools = "0.10.5"
|
itertools = "0.10.5"
|
||||||
regex = "1.7.0"
|
regex = "1.7.0"
|
||||||
tuple-map = "0.4.0"
|
tuple-map = "0.4.0"
|
||||||
|
1005
input/07.txt
1005
input/07.txt
File diff suppressed because it is too large
Load Diff
@ -1,18 +1,68 @@
|
|||||||
use crate::read;
|
use crate::read;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use tuple_map::*;
|
use indextree::Arena;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Directory {
|
||||||
|
pub size: usize,
|
||||||
|
pub name: String
|
||||||
|
}
|
||||||
|
|
||||||
pub fn run() {
|
pub fn run() {
|
||||||
let input = read("04");
|
let arena = &mut Arena::new();
|
||||||
let lines = input.lines();
|
let mut current_directory = arena.new_node(Directory {
|
||||||
let lines = input.split("\n\n");
|
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")]
|
#[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")]
|
#[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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user