diff --git a/.aoc_tiles/tiles/2025/11.png b/.aoc_tiles/tiles/2025/11.png new file mode 100644 index 0000000..a3e9c63 Binary files /dev/null and b/.aoc_tiles/tiles/2025/11.png differ diff --git a/README.md b/README.md index 8897295..3d75012 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@

- 2025 - 18 ⭐ - Rust + 2025 - 19 ⭐ - Rust

@@ -32,4 +32,7 @@ + + + diff --git a/src/day11.rs b/src/day11.rs new file mode 100644 index 0000000..308ea7a --- /dev/null +++ b/src/day11.rs @@ -0,0 +1,88 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +use cached::proc_macro::cached; +use indicatif::{ProgressBar, ProgressFinish, ProgressStyle}; +use itertools::Itertools; +use std::collections::HashMap; + +type Edges = HashMap>; + +#[aoc_generator(day11)] +fn parse(input: &str) -> (Edges, Edges) { + let mut edges: Edges = HashMap::new(); + let mut rev_edges: Edges = HashMap::new(); + for l in input.lines() { + let (k, rest) = l.split_once(": ").unwrap(); + for v in rest.split_ascii_whitespace() { + edges.entry(k.to_string()).or_default().push(v.to_string()); + rev_edges + .entry(v.to_string()) + .or_default() + .push(k.to_string()); + } + } + + (edges, rev_edges) +} + +fn find_path(cur: &str, goal: &str, edges: &Edges) -> u64 { + if cur == goal { + return 1; + } + if let Some(nexts) = edges.get(cur) { + nexts.iter().map(|n| find_path(n, goal, edges)).sum() + } else { + 0 + } +} + +#[aoc(day11, part1)] +fn part1((fwd, rev): &(Edges, Edges)) -> u64 { + let mut count = 0u64; + let mut to_check = Vec::from_iter(rev["out"].iter()); + + let mut pb = ProgressBar::no_length() + .with_style( + ProgressStyle::with_template( + "[{elapsed_precise}/{eta_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {per_sec}", + ) + .unwrap(), + ) + .with_finish(indicatif::ProgressFinish::AndLeave); + + find_path("you", "out", fwd) +} + +#[aoc(day11, part2)] +fn part2(input: &(Edges, Edges)) -> u64 { + 0 +} + +#[cfg(test)] +mod tests { + use rstest::rstest; + + use super::*; + + const EXAMPLE: &str = "aaa: you hhh +you: bbb ccc +bbb: ddd eee +ccc: ddd eee fff +ddd: ggg +eee: out +fff: out +ggg: out +hhh: ccc fff iii +iii: out"; + + #[rstest] + #[case(EXAMPLE, 5)] + fn part1_example(#[case] input: &str, #[case] expected: u64) { + assert_eq!(part1(&parse(input)), expected); + } + + #[rstest] + #[case(EXAMPLE, 0)] + fn part2_example(#[case] input: &str, #[case] expected: u64) { + assert_eq!(part2(&parse(input)), expected); + } +} diff --git a/src/lib.rs b/src/lib.rs index 4831a4d..8afe3bf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,5 +1,6 @@ mod day1; mod day10; +mod day11; mod day2; mod day3; mod day4;