diff --git a/src/days.rs b/src/days.rs index 1e38d08..ec4feb9 100644 --- a/src/days.rs +++ b/src/days.rs @@ -12,7 +12,7 @@ pub mod d11; pub mod d12; pub mod d13; pub mod d14; -// pub mod d15; +pub mod d15; // pub mod d16; // pub mod d17; // pub mod d18; diff --git a/src/days/d15.rs b/src/days/d15.rs new file mode 100644 index 0000000..35bf1a2 --- /dev/null +++ b/src/days/d15.rs @@ -0,0 +1,58 @@ +use crate::prelude::*; + +pub type I = Vec<(usize, usize)>; +pub type O = usize; + +fn _parse (data: &str) -> I { + data.lines() + .map(|e| e.trim().trim_matches('.') + .split_once(" has ") + .map(|(_, r)| + r.split_once(" positions; at time=0, it is at position ") + .map(|(n, p)| (n.parse().unwrap(), p.parse().unwrap())) + ) + .flatten() + .unwrap() + ) + .collect() +} + +fn _solve (data: &I) -> O { + let d = |time, (size, position)| (time + position) % size == 0; + (0..).into_iter().find(|t| data.iter().enumerate().all(|(i, &df)| d(t + i + 1, df))).unwrap() +} + +fn _silver (data: I) -> O { + _solve(&data) +} + +fn _gold (mut data: I) -> O { + data.push((11, 0)); + _solve(&data) +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + let data = inc!(15); + _parse(data) + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(data); + + assert_eq!(ans, 122318) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(data); + + assert_eq!(ans, 3208583) + } +}