solution: day 18

This commit is contained in:
YK 2024-11-27 03:00:26 +03:00
parent 350f6ef6eb
commit 06e554c53e
2 changed files with 65 additions and 1 deletions

View File

@ -15,7 +15,7 @@ pub mod d14;
pub mod d15; pub mod d15;
pub mod d16; pub mod d16;
pub mod d17; pub mod d17;
// pub mod d18; pub mod d18;
// pub mod d19; // pub mod d19;
// pub mod d20; // pub mod d20;
// pub mod d21; // pub mod d21;

64
src/days/d18.rs Normal file
View File

@ -0,0 +1,64 @@
use crate::prelude::*;
pub type I = &'static str;
pub type O = usize;
// @TODO: try bit mast approach
fn _solve (data: I, rows: usize) -> O {
let w = data.len();
let mut v = vec![data.to_owned()];
while v.len() < rows {
let mut v2 = String::new();
let prev = &v[v.len() - 1].chars().collect_vec();
for i in 0..w {
let next = match (
i.checked_sub(1).map(|i| prev.get(i)).flatten().unwrap_or(&'.'),
prev.get(i).unwrap_or(&'.'),
prev.get(i+1).unwrap_or(&'.')
) {
('^', '^', '.') | ('.', '^', '^') | ('^', '.', '.') | ('.', '.', '^') => '^',
_ => '.'
};
v2.push(next);
}
v.push(v2);
}
v.concat().chars().filter(|&c| c == '.').count()
}
#[cfg(test)]
mod test {
use super::*;
fn read () -> I {
inc!(18).trim()
}
#[test]
fn example () {
let data = ".^^.^.^^^^";
let ans = _solve(data, 10);
assert_eq!(ans, 38);
let data = "..^^.";
let ans = _solve(data, 3);
assert_eq!(ans, 6);
}
#[test]
fn silver () {
let data = read();
let ans = _solve(data, 40);
assert_eq!(ans, 1982)
}
#[test]
fn gold () {
let data = read();
let ans = _solve(data, 400_000);
assert_eq!(ans, 20005203)
}
}