solution: day 8
This commit is contained in:
parent
60999332dc
commit
bb4e9bbbdd
@ -5,7 +5,7 @@ pub mod d4;
|
|||||||
pub mod d5;
|
pub mod d5;
|
||||||
pub mod d6;
|
pub mod d6;
|
||||||
pub mod d7;
|
pub mod d7;
|
||||||
// pub mod d8;
|
pub mod d8;
|
||||||
// pub mod d9;
|
// pub mod d9;
|
||||||
// pub mod d10;
|
// pub mod d10;
|
||||||
// pub mod d11;
|
// 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