diff --git a/Cargo.lock b/Cargo.lock index 764b803..d214256 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,7 +19,7 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aoc" -version = "42.0.0" +version = "43.0.0" dependencies = [ "itertools", ] @@ -105,7 +105,7 @@ checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" [[package]] name = "download" -version = "42.0.0" +version = "43.0.0" dependencies = [ "dotenvy", "pico-args", @@ -643,7 +643,7 @@ checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" [[package]] name = "scaffold" -version = "42.0.0" +version = "43.0.0" dependencies = [ "dotenvy", "pico-args", diff --git a/Cargo.toml b/Cargo.toml index d96ea2a..b254bf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ members = ["utils/download", "utils/scaffold"] [workspace.package] description = "template for advent of code" readme = "README.md" -version = "42.0.0" +version = "43.0.0" edition = "2021" license = "MIT" authors = ["Matej Janežič "] diff --git a/src/template.rs b/src/template.rs index 2b6051d..d1dc75a 100644 --- a/src/template.rs +++ b/src/template.rs @@ -10,36 +10,39 @@ pub const ANSI_ITALIC: &str = "\x1b[3m"; pub const ANSI_BOLD: &str = "\x1b[1m"; pub const ANSI_RESET: &str = "\x1b[0m"; +use std::fmt::Display; +use std::time::Duration; +use std::time::Instant; + +fn time_solution(func: impl FnOnce(&str) -> Option, input: &str) -> Option<(T, Duration)> { + let timer = Instant::now(); + let result = func(input); + let elapsed = timer.elapsed(); + + result.map(|result| (result, elapsed)) +} + +pub fn print_result(func: impl FnOnce(&str) -> Option, input: &str, part: u8) { + match time_solution(func, input) { + Some((result, elapsed)) => { + println!( + "{}Part {}{}: {} {}(elapsed: {:.2?}){}", + ANSI_BOLD, part, ANSI_RESET, result, ANSI_ITALIC, elapsed, ANSI_RESET + ); + } + None => { + println!("{}Part {}{}: not solved.", ANSI_BOLD, part, ANSI_RESET) + } + } +} + #[macro_export] macro_rules! solution { ($day:expr) => { - use aoc::template::{ANSI_BOLD, ANSI_ITALIC, ANSI_RESET}; - use std::fmt::Display; - use std::time::Instant; - - fn print_result(func: impl FnOnce(&str) -> Option, input: &str) { - let timer = Instant::now(); - let result = func(input); - let elapsed = timer.elapsed(); - match result { - Some(result) => { - println!( - "{} {}(elapsed: {:.2?}){}", - result, ANSI_ITALIC, elapsed, ANSI_RESET - ); - } - None => { - println!("not solved.") - } - } - } - fn main() { - let input = aoc::template::read_file("inputs", 1); - print!("{}Part {}{}: ", ANSI_BOLD, 1, ANSI_RESET); - print_result(part_one, &input); - print!("{}Part {}{}: ", ANSI_BOLD, 2, ANSI_RESET); - print_result(part_two, &input); + let input = aoc::template::read_file("inputs", $day); + aoc::template::print_result(part_one, &input, 1); + aoc::template::print_result(part_two, &input, 2); } }; }