From bb4e9bbbdd4ee669e89e6517ed08fa163f442f01 Mon Sep 17 00:00:00 2001 From: YK Date: Sun, 8 Dec 2024 21:59:58 +0300 Subject: [PATCH] solution: day 8 --- src/days.rs | 2 +- src/days/d8.rs | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/days/d8.rs diff --git a/src/days.rs b/src/days.rs index fa88115..0d27540 100644 --- a/src/days.rs +++ b/src/days.rs @@ -5,7 +5,7 @@ pub mod d4; pub mod d5; pub mod d6; pub mod d7; -// pub mod d8; +pub mod d8; // pub mod d9; // pub mod d10; // pub mod d11; diff --git a/src/days/d8.rs b/src/days/d8.rs new file mode 100644 index 0000000..88a2d05 --- /dev/null +++ b/src/days/d8.rs @@ -0,0 +1,91 @@ +use crate::prelude::*; + +pub type I = (M>, isize, isize); +pub type O = usize; + +fn _parse (data: &str) -> I { + let data = data.trim(); + let lines = data.lines(); + + let mut w = 0; + let mut h = 0; + + let mut m: M> = M::new(); + + for l in lines { + let l = l.trim(); + w = l.len(); + for (i, c) in l.chars().enumerate() { + m.entry(c).or_default().push((h as isize, i as isize)); + } + h += 1; + } + + m.remove(&'.'); + + (m, w as isize, h as isize) +} + +fn _solve ((map, width, height): I, n: isize) -> O { + let is_valid = |(y, x): &(isize, isize)| (0..width).contains(x) && (0..height).contains(y); + + let mut s = S::new(); + + for v in map.values() { + for (a, b) in v.into_iter().tuple_combinations() { + let ydiff = b.0 - a.0; + let xdiff = b.1 - a.1; + + if n > 1 { + s.insert(*a); + s.insert(*b); + } + + for i in 1..=n { + let ydiff_mul = ydiff * i; + let xdiff_mul = xdiff * i; + + let new = [(b.0 + ydiff_mul, b.1 + xdiff_mul), (a.0 - ydiff_mul, a.1 - xdiff_mul)]; + + s.extend(new.into_iter().filter(is_valid)); + + } + } + }; + + s.len() +} + +fn _silver (i: I) -> O { + _solve(i, 1) +} + +fn _gold (i: I) -> O { + _solve(i, 50) +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + let data = inc!(8); + _parse(data) + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(data); + + assert_eq!(ans, 299) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(data); + + assert_eq!(ans, 1032) + } +}