solution: day 10
This commit is contained in:
parent
d84113bf2e
commit
3fd38a2393
@ -7,7 +7,7 @@ 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;
|
||||||
// pub mod d12;
|
// pub mod d12;
|
||||||
// pub mod d13;
|
// pub mod d13;
|
||||||
|
|||||||
103
src/days/d10.rs
Normal file
103
src/days/d10.rs
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
pub type I1 = Vec<Vec<char>>;
|
||||||
|
pub type I2 = Vec<(usize, usize)>;
|
||||||
|
pub type O = usize;
|
||||||
|
|
||||||
|
fn _parse (data: &str) -> (I1, I2) {
|
||||||
|
data.trim().lines().enumerate().fold((vec![], vec![]), |(mut map, mut zeroes), (y, line)| {
|
||||||
|
let mut l = vec![];
|
||||||
|
for (x, c) in line.trim().chars().enumerate() {
|
||||||
|
l.push(c);
|
||||||
|
if c == '0' { zeroes.push((y, x)); }
|
||||||
|
}
|
||||||
|
map.push(l);
|
||||||
|
(map, zeroes)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _dfs (
|
||||||
|
pos @ (y, x): (usize, usize),
|
||||||
|
map: &[Vec<char>],
|
||||||
|
visited: &mut S<(usize, usize)>,
|
||||||
|
silver: &mut S<(usize, usize)>,
|
||||||
|
gold: &mut O,
|
||||||
|
) {
|
||||||
|
visited.insert(pos);
|
||||||
|
|
||||||
|
let current = map[y][x];
|
||||||
|
if current == '9' {
|
||||||
|
silver.insert(pos);
|
||||||
|
*gold += 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let neighbors = [(-1, 0), (0, -1), (0, 1), (1, 0)].into_iter().filter_map(|(dy, dx)| match (y.checked_add_signed(dy), x.checked_add_signed(dx)) {
|
||||||
|
(Some(y), Some(x)) if y < map.len() && x < map[0].len() => Some((y, x)),
|
||||||
|
_ => None
|
||||||
|
}).filter(|&(y, x)| map[y][x] as u8 - current as u8 == 1);
|
||||||
|
|
||||||
|
|
||||||
|
let cloned = visited.clone();
|
||||||
|
|
||||||
|
for n in neighbors {
|
||||||
|
if !visited.contains(&n) {
|
||||||
|
_dfs(n, map, visited, silver, gold);
|
||||||
|
}
|
||||||
|
*visited = cloned.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _solve ((map, zeroes): &(I1, I2)) -> (O, O) {
|
||||||
|
let (mut silver, mut gold) = (0, 0);
|
||||||
|
|
||||||
|
for &z in zeroes {
|
||||||
|
let mut _sm = S::new();
|
||||||
|
_dfs(z, &map, &mut S::new(), &mut _sm, &mut gold);
|
||||||
|
silver += _sm.len();
|
||||||
|
}
|
||||||
|
(silver, gold)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _silver (i: &(I1, I2)) -> O {
|
||||||
|
_solve(i).0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _gold (i: &(I1, I2)) -> O {
|
||||||
|
_solve(i).1
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
fn read () -> (I1, I2) {
|
||||||
|
let data = inc!(10);
|
||||||
|
_parse(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sample () {
|
||||||
|
let data = inc!("10_example");
|
||||||
|
let data = _parse(data);
|
||||||
|
|
||||||
|
assert_eq!(_silver(&data), 36);
|
||||||
|
assert_eq!(_gold(&data), 81);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn silver () {
|
||||||
|
let data = read();
|
||||||
|
let ans = _silver(&data);
|
||||||
|
|
||||||
|
assert_eq!(ans, 694)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn gold () {
|
||||||
|
let data = read();
|
||||||
|
let ans = _gold(&data);
|
||||||
|
|
||||||
|
assert_eq!(ans, 1497)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user