Made everything a bit more rustic

This commit is contained in:
Rüdiger Ludwig 2023-07-29 17:02:25 +02:00
parent 7f5b6e03f9
commit a5f19ecae1
22 changed files with 376 additions and 274 deletions

View file

@ -1,3 +1,5 @@
use crate::common::file::split_lines;
use super::template::{DayTrait, ResultType};
use once_cell::sync::Lazy;
use regex::Regex;
@ -13,13 +15,13 @@ impl DayTrait for Day {
DAY_NUMBER
}
fn part1(&self, lines: &[String]) -> anyhow::Result<ResultType> {
let troop = Troop::parse(lines)?;
fn part1(&self, lines: &str) -> anyhow::Result<ResultType> {
let troop = Troop::try_from(lines)?;
Ok(ResultType::Integer(troop.play(20)))
}
fn part2(&self, lines: &[String]) -> anyhow::Result<ResultType> {
let troop = Troop::parse(lines)?;
fn part2(&self, lines: &str) -> anyhow::Result<ResultType> {
let troop = Troop::try_from(lines)?;
Ok(ResultType::Integer(troop.play_again(10_000)))
}
}
@ -90,7 +92,7 @@ impl Monkey {
}
pub fn parse_one(
iterator: &mut dyn Iterator<Item = &String>,
iterator: &mut dyn Iterator<Item = &str>,
) -> Result<Option<Monkey>, MonkeyError> {
if let Some(line) = iterator.next() {
let number: usize = Monkey::parse_line(&MONKEY, line)?.parse()?;
@ -142,16 +144,20 @@ struct Troop {
monkeys: Vec<Monkey>,
}
impl Troop {
pub fn parse(lines: &[String]) -> Result<Troop, MonkeyError> {
let mut iter = lines.iter();
impl TryFrom<&str> for Troop {
type Error = MonkeyError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
let mut iter = split_lines(value);
let mut monkeys = Vec::new();
while let Some(monkey) = Monkey::parse_one(&mut iter)? {
monkeys.push(monkey);
}
Ok(Troop { monkeys })
}
}
impl Troop {
fn do_play<F>(&self, rounds: usize, alter: F) -> i64
where
F: Fn(i64) -> i64,
@ -191,13 +197,14 @@ impl Troop {
#[cfg(test)]
mod test {
use super::*;
use crate::common::file::read_lines;
use crate::common::file::read_string;
use anyhow::Result;
#[test]
fn test_parse() -> Result<()> {
let day = Day {};
let lines = read_lines(day.get_day_number(), "example01.txt")?;
let lines = read_string(day.get_day_number(), "example01.txt")?;
let mut lines = split_lines(&lines);
let expected = Monkey {
number: 0,
items: vec![79, 98],
@ -206,7 +213,7 @@ mod test {
good_monkey: 2,
bad_monkey: 3,
};
let result = Monkey::parse_one(&mut lines.iter())?.unwrap();
let result = Monkey::parse_one(&mut lines)?.unwrap();
assert_eq!(result, expected);
Ok(())
@ -215,9 +222,9 @@ mod test {
#[test]
fn test_parse_all() -> Result<()> {
let day = Day {};
let lines = read_lines(day.get_day_number(), "example01.txt")?;
let lines = read_string(day.get_day_number(), "example01.txt")?;
let expected = 4;
let result = Troop::parse(&lines)?;
let result = Troop::try_from(lines.as_str())?;
assert_eq!(result.monkeys.len(), expected);
Ok(())
@ -226,7 +233,7 @@ mod test {
#[test]
fn test_part1() -> Result<()> {
let day = Day {};
let lines = read_lines(day.get_day_number(), "example01.txt")?;
let lines = read_string(day.get_day_number(), "example01.txt")?;
let expected = ResultType::Integer(10605);
let result = day.part1(&lines)?;
assert_eq!(result, expected);
@ -237,7 +244,7 @@ mod test {
#[test]
fn test_part2() -> Result<()> {
let day = Day {};
let lines = read_lines(day.get_day_number(), "example01.txt")?;
let lines = read_string(day.get_day_number(), "example01.txt")?;
let expected = ResultType::Integer(2713310158);
let result = day.part2(&lines)?;
assert_eq!(result, expected);