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

60
day-05-rust/src/common.rs Normal file
View File

@@ -0,0 +1,60 @@
use std::collections::HashMap;
use std::io::{Bytes, Read};
use std::iter::Peekable;
use crate::common;
pub type Number = i32;
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub struct Rule {
pub first: Number,
pub second: Number,
}
pub fn read_rules<R: Read>(mut input: &mut Peekable<Bytes<R>>) -> HashMap<Number, Vec<Rule>> {
let mut rules_by_number = HashMap::<Number, Vec<Rule>>::new();
while let Some(Ok(ch)) = input.peek() {
if ch == &b'\n' {
input.next();
break;
}
let first = common::read_number(&mut input);
input.next();
let second = common::read_number(&mut input);
input.next();
let rule = Rule { first, second };
rules_by_number
.entry(rule.first)
.or_default()
.push(rule.clone());
rules_by_number.entry(rule.second).or_default().push(rule);
}
rules_by_number
}
pub fn read_number_list<R: Read>(mut input: &mut Peekable<Bytes<R>>) -> Vec<Number> {
let mut numbers = Vec::<Number>::new();
while let Some(Ok(ch)) = input.peek() {
if ch == &b'\n' {
break;
} else if ch == &b',' {
input.next();
continue;
}
let number = common::read_number(&mut input);
numbers.push(number);
}
numbers
}
pub fn read_number<R: Read>(input: &mut Peekable<Bytes<R>>) -> Number {
let mut number: Number = 0;
while let Some(Ok(b'0'..=b'9')) = input.peek() {
number *= 10;
number += (input.next().unwrap().unwrap() - b'0') as Number;
}
number
}