From bbfa36777583f357d33740ca7e6510998ccfbbd4 Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 9 Dec 2022 09:20:34 +0100 Subject: [PATCH] Slightly better ICACHE hits --- 2022/src/day08.rs | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/2022/src/day08.rs b/2022/src/day08.rs index b0784a1..9e311de 100644 --- a/2022/src/day08.rs +++ b/2022/src/day08.rs @@ -70,30 +70,34 @@ fn scenery<'a>( tree_stack.clear(); for (i, (&val, score)) in values.into_iter().zip(visible).enumerate() { - if i > 0 { - let mut first = 0; + scenery_helper(i, tree_stack, val, score); + } +} - while let Some((pos, other)) = tree_stack.pop() { - match other.cmp(&val) { - Ordering::Less => (), - Ordering::Equal => { - first = pos; - break; - } - Ordering::Greater => { - tree_stack.push((pos, other)); - first = pos; - break; - } +fn scenery_helper(i: usize, tree_stack: &mut Vec<(usize, u8)>, val: u8, score: &mut usize) { + if i > 0 { + let mut first = 0; + + while let Some((pos, other)) = tree_stack.pop() { + match other.cmp(&val) { + Ordering::Less => (), + Ordering::Equal => { + first = pos; + break; + } + Ordering::Greater => { + tree_stack.push((pos, other)); + first = pos; + break; } } - - tree_stack.push((i, val)); - - *score *= i - first; - } else { - *score = 0; } + + tree_stack.push((i, val)); + + *score *= i - first; + } else { + *score = 0; } } @@ -106,7 +110,7 @@ pub fn part2(input: &[u8]) -> Result { let mut score = vec![1; width * height]; - let mut tree_stack = Vec::new(); + let mut tree_stack = Vec::with_capacity(10); // Horizontal striping for (y, row) in input.chunks_exact(width + 1).enumerate() {