diff --git a/src/days.rs b/src/days.rs index 610149f..65bf211 100644 --- a/src/days.rs +++ b/src/days.rs @@ -15,7 +15,7 @@ pub mod d14; pub mod d15; pub mod d16; pub mod d17; -// pub mod d18; +pub mod d18; // pub mod d19; // pub mod d20; // pub mod d21; diff --git a/src/days/d18.rs b/src/days/d18.rs new file mode 100644 index 0000000..7219b57 --- /dev/null +++ b/src/days/d18.rs @@ -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) + } +}