This commit is contained in:
2024-12-05 22:08:53 +01:00
parent 48c6f5db00
commit 14a90754c2
7 changed files with 227 additions and 0 deletions

45
day-05-rust/src/task1.rs Normal file
View File

@@ -0,0 +1,45 @@
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);
}