Files
adventofcode24/day-05-rust/src/task1.rs
2024-12-05 22:08:53 +01:00

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);
}