JonathanGupton

Advent of Code 2022 - Day 6

Dec 6th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 0.99 KB | None | 0 0
  1. use std::collections::VecDeque;
  2.  
  3. fn find_start_of_next_packet(packet: &str, distinct: usize) -> usize {
  4.     let mut position = 0;
  5.     let mut letters: [u32; 26] = [0; 26];
  6.     let mut queue: VecDeque<char> = VecDeque::with_capacity(distinct);
  7.  
  8.     let mut packet_iter = packet.chars();
  9.  
  10.     // Load the holding deque and char counts
  11.     for _ in 0..distinct {
  12.         if let Some(c) = packet_iter.next() {
  13.             queue.push_back(c);
  14.             letters[(c as usize) - 97usize] += 1;
  15.             position += 1;
  16.         }
  17.     }
  18.  
  19.     // loop through chars to find break point
  20.     while let Some(c) = packet_iter.next() {
  21.         if letters.iter().filter(|v| **v > 0u32).count() == distinct {
  22.             break;
  23.         } else {
  24.             let remove = queue.pop_front().unwrap();
  25.             letters[(remove as usize) - 97usize] -= 1;
  26.             queue.push_back(c);
  27.             letters[(c as usize) - 97usize] += 1;
  28.             position += 1;
  29.         }
  30.     }
  31.  
  32.     position
  33. }
Advertisement
Add Comment
Please, Sign In to add comment