diff --git a/src/days/d9.rs b/src/days/d9.rs index 13a5341..b1d3a9e 100644 --- a/src/days/d9.rs +++ b/src/days/d9.rs @@ -3,25 +3,25 @@ use crate::prelude::*; pub type I = SS; pub type O = usize; -fn _expand (mut data: impl Iterator) -> String { - let mut stack = String::new(); +fn _expand (mut data: impl Iterator) -> O { + let mut stack = 0; - data.by_ref().take_while(|e| *e != '(').for_each(|c| stack.push(c)); + data.by_ref().take_while(|e| *e != '(').for_each(|_| stack += 1); 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::(); + let 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 t = if let Some(p) = taken.find("(") { + p + _expand(taken[p..].chars()) + } else { + taken.len() + }; let times = times.parse::().unwrap(); - stack.push_str(&taken.repeat(times)); - stack.push_str(&_expand(data)); + stack += t * times; + stack += _expand(data); stack } @@ -53,7 +53,7 @@ fn _silver (data: I) -> O { fn _gold (data: I) -> O { let stack = _expand(data.trim().chars()); - stack.len() + stack } #[cfg(test)]