Day five
This commit is contained in:
45
day-05-rust/src/task1.rs
Normal file
45
day-05-rust/src/task1.rs
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user