use crate::common::{read_number_list, read_rules, Number}; use std::collections::HashSet; use std::io::Read; use std::ops::Rem; pub fn run(read: R) { let mut input = read.bytes().peekable(); let rules_by_number = read_rules(&mut input); let mut result: Number = 0; while let Some(Ok(ch)) = input.peek() { if ch == &b'\n' { input.next(); continue; } let numbers = read_number_list(&mut input); let rules = numbers .iter() .flat_map(|number| rules_by_number.get(number)) .flatten() .filter(|rule| numbers.contains(&rule.first) && numbers.contains(&rule.second)) .collect::>(); if rules.iter().all(|rule| { numbers .iter() .position(|number| *number == rule.first) .zip(numbers.iter().position(|number| *number == rule.second)) .map(|(first_index, second_index)| first_index < second_index) .unwrap_or(false) }) { if numbers.len().rem(2) == 1 { result += numbers[numbers.len() / 2]; } else { eprintln!("Length of numbers is not odd!") } } } println!("Result {}", result); }