From 0de6e22a0020a3c0f073da00355e3369434e8329 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Thu, 13 Dec 2018 14:47:00 +0100 Subject: [PATCH] Deduplicate day 12. --- 2018/src/day12.rs | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/2018/src/day12.rs b/2018/src/day12.rs index c3c0ff5..efad03e 100644 --- a/2018/src/day12.rs +++ b/2018/src/day12.rs @@ -77,29 +77,12 @@ impl Day12 { fn simulate(&self, state: &State) -> State { let mut new_state = Vec::with_capacity(state.len() + 8); let mut index = 0; - let mut last_idx = None; for &(idx, b) in state { - index = (index << 1) & 0x1f; - if b { - index |= 1; - } - - if self.productions[index] { - new_state.push((idx - 2, true)); - } else if !new_state.is_empty() { - new_state.push((idx - 2, false)); - } - last_idx = Some(idx); + index = self.advance_state(&mut new_state, index, idx, b) } - if let Some(idx) = last_idx { + if let Some((idx, _)) = state.last() { for i in 1..=4 { - index = (index << 1) & 0x1f; - - if self.productions[index] { - new_state.push((idx + i - 2, true)); - } else if !new_state.is_empty() { - new_state.push((idx + i - 2, false)); - } + index = self.advance_state(&mut new_state, index, idx + i, false); } } @@ -110,6 +93,17 @@ impl Day12 { new_state } + fn advance_state(&self, new_state: &mut State, mut index: usize, idx: i64, b: bool) -> usize { + index = (index << 1) & 0x1f | b as usize; + if self.productions[index] { + new_state.push((idx - 2, true)); + } else if !new_state.is_empty() { + new_state.push((idx - 2, false)); + } + + index + } + fn simulate_n(&self, mut state: State, n: usize) -> State { for _ in 0..n { state = self.simulate(&state);