day01 finished

This commit is contained in:
Ruediger Ludwig 2023-01-26 21:52:09 +01:00
parent 284f099d3e
commit 68fefd064a
9 changed files with 2487 additions and 164 deletions

View file

@ -1,27 +1,84 @@
mod common;
mod days;
mod macros;
use std::error::Error;
use anyhow::Result;
use common::file::read_data;
use days::{DayProvider, ResultType};
use days::{day_provider, DayTrait, ResultType};
use std::env;
use thiserror::Error;
fn main() -> Result<(), Box<dyn Error>> {
let day_provider = DayProvider::create();
//let params = env::args().skip(1).collect::<Vec<_>>();
let day = day_provider.get_day(1)?;
let lines = read_data(day.get_day_number(), "input.txt")?;
match day.part1(lines)? {
fn output(day: usize, part: usize, result: ResultType) -> () {
match result {
ResultType::IntResult(value) => {
println!("Day {:02} part {}: {}", day.get_day_number(), 1, value);
println!("Day {:02} part {}: {}", day, part, value);
}
ResultType::StringResult(_) => todo!(),
ResultType::LinesResult(_) => todo!(),
ResultType::NoResult => todo!(),
ResultType::StringResult(value) => {
println!("Day {:02} part {}: {}", day, part, value);
}
ResultType::LinesResult(value) => {
println!("Day {:02} part {}: {}", day, part, value[0]);
for line in &value[1..] {
println!(" part : {}", line);
}
}
ResultType::NoResult => {
println!("Day {:02} part {}: (None)", day, part);
}
}
}
fn run(day: Box<dyn DayTrait>, part1: bool, part2: bool) -> Result<()> {
let lines = read_data(day.get_day_number(), "input.txt")?;
if part1 {
output(1, 1, day.part1(&lines)?);
}
if part2 {
output(1, 2, day.part2(&lines)?);
}
Ok(())
}
#[derive(Debug, Error)]
enum ParamError {
#[error("Too many Parameters: {0}")]
TooManyParameters(usize),
#[error("Unknown Part: {0}")]
UnknownPart(usize),
}
fn run_on_parameters(params: &[String]) -> Result<()> {
match params.len() {
0 => {
for day in day_provider::get_all_days() {
run(day, true, true)?;
}
}
1 => {
let mut parts = params[0].split("/");
if let Some(day_str) = parts.next() {
let day_number = day_str.parse::<usize>()?;
let day = day_provider::get_day(day_number)?;
if let Some(part_str) = parts.next() {
match part_str.parse::<usize>()? {
1 => run(day, true, false)?,
2 => run(day, false, true)?,
p => Err(ParamError::UnknownPart(p))?,
}
} else {
run(day, true, true)?;
}
}
}
n => Err(ParamError::TooManyParameters(n))?,
}
Ok(())
}
fn main() -> Result<()> {
let params = env::args().skip(1).collect::<Vec<_>>();
run_on_parameters(&params)
}