use crate::LineResult; const FREQ_TABLE: [usize; 256] = { let mut tab = [0; 256]; tab[17] = 1; tab[25] = 7; tab[30] = 4; tab[34] = 2; tab[37] = 5; tab[39] = 3; tab[41] = 6; tab[42] = 0; tab[45] = 9; tab[49] = 8; tab }; #[must_use] #[inline] pub fn unscramble(line: &str) -> LineResult { let mut bytes = line.bytes(); let mut counts = [0; 7]; loop { match bytes.next().unwrap() { c @ b'a'..=b'g' => { counts[c as usize - b'a' as usize] += 1; } b'|' => break, _ => {} } } bytes.next(); let mut freq = 0; let mut unique_digits = 0; let mut number = 0; loop { let c = bytes.next(); match c { Some(b' ') | None => { let digit = FREQ_TABLE[freq & 0xff]; if [1, 4, 7, 8].contains(&digit) { unique_digits += 1; } number = number * 10 + digit; freq = 0; if c.is_none() { break; } } Some(c @ b'a'..=b'g') => { freq += counts[c as usize - b'a' as usize]; }, Some(_) => {} } } LineResult { unique_digits, number, } }