From 1cd5579bf6ae57a55f2f459ea9e0a8ee2598707d Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Tue, 6 Dec 2022 18:37:38 +0100 Subject: [PATCH] Use iterators instead of explicit indexing --- 2022/src/day06.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/2022/src/day06.rs b/2022/src/day06.rs index ad1e3b4..587d649 100644 --- a/2022/src/day06.rs +++ b/2022/src/day06.rs @@ -3,20 +3,22 @@ use anyhow::Result; fn find_first(input: &[u8], unique: usize) -> Result { let mut seen = [false; 256]; + let mut tail_it = input.iter(); + let mut first = 0; // Loop invariant: input[first..last] contains only unique characters for (last, &c) in input.iter().enumerate() { if seen[c as usize] { - while input[first] != c { - seen[input[first] as usize] = false; - first += 1; - } - first += 1; + first += (&mut tail_it) + .take_while(|&&b| b != c) + .map(|&b| seen[b as usize] = false) + .count() + + 1; // +1 because take_while doesn't return the first element that didn't satisfy the condition, while we do need to count it } else { // New unique character found: input[first..=last] contains unique characters if last - first + 1 == unique { - return Ok(first + unique); + return Ok(last + 1); } seen[c as usize] = true;