solution/refactor: day 9 (simulation approach; 1000x faster)

This commit is contained in:
YK 2024-11-20 11:56:37 +03:00
parent 4614df8845
commit 27501c65ee

View File

@ -3,25 +3,25 @@ use crate::prelude::*;
pub type I = SS; pub type I = SS;
pub type O = usize; pub type O = usize;
fn _expand (mut data: impl Iterator<Item = char>) -> String { fn _expand (mut data: impl Iterator<Item = char>) -> O {
let mut stack = String::new(); 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::<String>(); let a = data.by_ref().take_while(|c| *c != ')').collect::<String>();
let Some((len, times)) = a.split_once('x') else { return stack }; let Some((len, times)) = a.split_once('x') else { return stack };
let len = len.parse::<usize>().unwrap(); let len = len.parse::<usize>().unwrap();
let mut taken = data.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::<String>(); let taken = data.by_ref().take(len).filter(|e| !e.is_control() && !e.is_whitespace()).collect::<String>();
while let Some(p) = taken.find("(") { let t = if let Some(p) = taken.find("(") {
let new = format!("{}{}", &taken[..p], _expand(taken[p..].chars())); p + _expand(taken[p..].chars())
// println!("{:?} -> {:?}", taken, new); } else {
taken = new; taken.len()
} };
let times = times.parse::<usize>().unwrap(); let times = times.parse::<usize>().unwrap();
stack.push_str(&taken.repeat(times)); stack += t * times;
stack.push_str(&_expand(data)); stack += _expand(data);
stack stack
} }
@ -53,7 +53,7 @@ fn _silver (data: I) -> O {
fn _gold (data: I) -> O { fn _gold (data: I) -> O {
let stack = _expand(data.trim().chars()); let stack = _expand(data.trim().chars());
stack.len() stack
} }
#[cfg(test)] #[cfg(test)]