46 lines
1.3 KiB
Rust
46 lines
1.3 KiB
Rust
use crate::common::{read_number_list, read_rules, Number};
|
|
use std::collections::HashSet;
|
|
use std::io::Read;
|
|
use std::ops::Rem;
|
|
|
|
pub fn run<R: Read>(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::<HashSet<_>>();
|
|
|
|
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);
|
|
}
|