solution: day 8

This commit is contained in:
YK 2024-12-08 21:59:58 +03:00
parent 60999332dc
commit bb4e9bbbdd
2 changed files with 92 additions and 1 deletions

View File

@ -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;

91
src/days/d8.rs Normal file
View File

@ -0,0 +1,91 @@
use crate::prelude::*;
pub type I = (M<char, Vec<(isize, isize)>>, 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<char, Vec<(isize, isize)>> = 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)
}
}