solution: day 8
This commit is contained in:
parent
60999332dc
commit
bb4e9bbbdd
@ -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
91
src/days/d8.rs
Normal 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)
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user