diff --git a/src/days.rs b/src/days.rs index 0d27540..18c513c 100644 --- a/src/days.rs +++ b/src/days.rs @@ -6,7 +6,7 @@ pub mod d5; pub mod d6; pub mod d7; pub mod d8; -// pub mod d9; +pub mod d9; // pub mod d10; // pub mod d11; // pub mod d12; diff --git a/src/days/d9.rs b/src/days/d9.rs new file mode 100644 index 0000000..13a5341 --- /dev/null +++ b/src/days/d9.rs @@ -0,0 +1,108 @@ +use crate::prelude::*; + +pub type I = SS; +pub type O = usize; + +fn _expand (mut data: impl Iterator) -> String { + let mut stack = String::new(); + + data.by_ref().take_while(|e| *e != '(').for_each(|c| stack.push(c)); + + let a = data.by_ref().take_while(|c| *c != ')').collect::(); + let Some((len, times)) = a.split_once('x') else { return stack }; + let len = len.parse::().unwrap(); + let mut taken = data.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::(); + + while let Some(p) = taken.find("(") { + let new = format!("{}{}", &taken[..p], _expand(taken[p..].chars())); + // println!("{:?} -> {:?}", taken, new); + taken = new; + } + + let times = times.parse::().unwrap(); + stack.push_str(&taken.repeat(times)); + stack.push_str(&_expand(data)); + + stack +} + +fn _silver (data: I) -> O { + let mut stack = String::new(); + let mut cs = data.trim().chars(); + + loop { + let Some(cur) = cs.next() else { break; }; + + match cur { + '(' => { + let a = cs.by_ref().take_while(|c| *c != ')').collect::(); + let (len, times) = a.split_once('x').unwrap(); + let len = len.parse::().unwrap(); + let times = times.parse::().unwrap(); + let taken = cs.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::(); + + stack.push_str(&taken.repeat(times)); + }, + e => stack.push(e), + } + + } + + stack.len() +} + +fn _gold (data: I) -> O { + let stack = _expand(data.trim().chars()); + stack.len() +} + +#[cfg(test)] +mod test { + use super::*; + + fn read () -> I { + inc!(9) + } + + #[test] + fn sample () { + + let cases = [ + ("ADVENT", 6), + ("X(8x2)(3x3)ABCY", 18), + ("A(1x5)BC", 7), + ("(3x3)XYZ", 9), + ("A(2x2)BCD(2x2)EFG", 11), + ("(6x1)(1x3)A", 6), + ]; + + for (i, o) in cases { + assert_eq!(_silver(i), o) + } + + let cases_gold = [ + ("X(8x2)(3x3)ABCY", 20), + ("(25x3)(3x3)ABC(2x3)XY(5x2)PQRSTX(18x9)(3x2)TWO(5x7)SEVEN", 445), + ]; + + for (i, o) in cases_gold { + assert_eq!(_gold(i), o) + } + } + + #[test] + fn silver () { + let data = read(); + let ans = _silver(&data); + + assert_eq!(ans, 74532) + } + + #[test] + fn gold () { + let data = read(); + let ans = _gold(&data); + + assert_eq!(ans, 11558231665) + } +}