solution/refactor: day 9 (simulation approach; 1000x faster)
This commit is contained in:
parent
4614df8845
commit
27501c65ee
@ -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)]
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user