day03 finished
This commit is contained in:
parent
eb1ce68486
commit
d7c85a75f6
8 changed files with 534 additions and 37 deletions
93
src/main.rs
93
src/main.rs
|
|
@ -5,39 +5,84 @@ mod macros;
|
|||
use anyhow::Result;
|
||||
use common::file::read_data;
|
||||
use days::{day_provider, DayTrait, ResultType};
|
||||
use std::env;
|
||||
use std::{
|
||||
env,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
use thiserror::Error;
|
||||
|
||||
fn output(day: usize, part: usize, result: ResultType) -> () {
|
||||
fn output(day: usize, part: usize, result: ResultType, time: Duration) -> () {
|
||||
match result {
|
||||
ResultType::IntResult(value) => {
|
||||
println!("Day {:02} part {}: {}", day, part, value);
|
||||
println!(
|
||||
"Day {:02} part {}: {} ({})",
|
||||
day,
|
||||
part,
|
||||
value,
|
||||
time.as_secs_f64()
|
||||
);
|
||||
}
|
||||
ResultType::StringResult(value) => {
|
||||
println!("Day {:02} part {}: {}", day, part, value);
|
||||
println!(
|
||||
"Day {:02} part {}: {} ({})",
|
||||
day,
|
||||
part,
|
||||
value,
|
||||
time.as_secs_f32()
|
||||
);
|
||||
}
|
||||
ResultType::LinesResult(value) => {
|
||||
println!("Day {:02} part {}: {}", day, part, value[0]);
|
||||
println!(
|
||||
"Day {:02} part {}: {} ({})",
|
||||
day,
|
||||
part,
|
||||
value[0],
|
||||
time.as_secs_f32()
|
||||
);
|
||||
for line in &value[1..] {
|
||||
println!(" part : {}", line);
|
||||
}
|
||||
}
|
||||
ResultType::NoResult => {
|
||||
println!("Day {:02} part {}: (None)", day, part);
|
||||
}
|
||||
ResultType::NoResult => {}
|
||||
}
|
||||
}
|
||||
|
||||
fn run(day: Box<dyn DayTrait>, part1: bool, part2: bool) -> Result<()> {
|
||||
let lines = read_data(day.get_day_number(), "input.txt")?;
|
||||
if part1 {
|
||||
output(day.get_day_number(), 1, day.part1(&lines)?);
|
||||
}
|
||||
if part2 {
|
||||
output(day.get_day_number(), 2, day.part2(&lines)?);
|
||||
}
|
||||
fn run_part(day: &Box<dyn DayTrait>, is_part1: bool, lines: &str) -> Result<Duration> {
|
||||
let now = Instant::now();
|
||||
let result = if is_part1 {
|
||||
day.part1(lines)?
|
||||
} else {
|
||||
day.part2(lines)?
|
||||
};
|
||||
|
||||
Ok(())
|
||||
if matches!(result, ResultType::NoResult) {
|
||||
Ok(Duration::ZERO)
|
||||
} else {
|
||||
let elapsed = now.elapsed();
|
||||
output(
|
||||
day.get_day_number(),
|
||||
if is_part1 { 1 } else { 2 },
|
||||
result,
|
||||
elapsed,
|
||||
);
|
||||
Ok(elapsed)
|
||||
}
|
||||
}
|
||||
|
||||
fn run(day: &Box<dyn DayTrait>, part1: bool, part2: bool) -> Result<Duration> {
|
||||
let lines = read_data(day.get_day_number(), "input.txt")?;
|
||||
let elapsed1 = if part1 {
|
||||
run_part(day, true, &lines)?
|
||||
} else {
|
||||
Duration::ZERO
|
||||
};
|
||||
let elapsed2 = if part2 {
|
||||
run_part(day, false, &lines)?
|
||||
} else {
|
||||
Duration::ZERO
|
||||
};
|
||||
|
||||
Ok(elapsed1 + elapsed2)
|
||||
}
|
||||
|
||||
#[derive(Debug, Error)]
|
||||
|
|
@ -52,9 +97,12 @@ enum ParamError {
|
|||
fn run_on_parameters(params: &[String]) -> Result<()> {
|
||||
match params.len() {
|
||||
0 => {
|
||||
let mut runtime = Duration::ZERO;
|
||||
for day in day_provider::get_all_days() {
|
||||
run(day, true, true)?;
|
||||
runtime += run(&day, true, true)?;
|
||||
}
|
||||
println!();
|
||||
println!("Runtime: {}", runtime.as_secs_f32());
|
||||
}
|
||||
1 => {
|
||||
let mut parts = params[0].split("/");
|
||||
|
|
@ -64,12 +112,13 @@ fn run_on_parameters(params: &[String]) -> Result<()> {
|
|||
|
||||
if let Some(part_str) = parts.next() {
|
||||
match part_str.parse::<usize>()? {
|
||||
1 => run(day, true, false)?,
|
||||
2 => run(day, false, true)?,
|
||||
1 => run(&day, true, false)?,
|
||||
2 => run(&day, false, true)?,
|
||||
p => Err(ParamError::UnknownPart(p))?,
|
||||
}
|
||||
};
|
||||
} else {
|
||||
run(day, true, true)?;
|
||||
let runtime = run(&day, true, true)?;
|
||||
println!("Runtime: {}", runtime.as_secs_f32());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue