aoc2024/src/main.rs
2024-12-16 09:36:49 +01:00

92 lines
2.5 KiB
Rust

use std::{fmt::Display, fs::read_to_string, time::Instant};
use color_eyre::eyre;
use tracing_subscriber::EnvFilter;
#[cfg(feature = "day1")]
mod day01;
#[cfg(feature = "day2")]
mod day02;
#[cfg(feature = "day3")]
mod day03;
#[cfg(feature = "day4")]
mod day04;
#[cfg(feature = "day5")]
mod day05;
#[cfg(feature = "day6")]
mod day06;
#[cfg(feature = "day7")]
mod day07;
#[cfg(feature = "day8")]
mod day08;
#[cfg(feature = "day9")]
mod day09;
#[cfg(feature = "day10")]
mod day10;
#[cfg(feature = "day11")]
mod day11;
#[cfg(feature = "day12")]
mod day12;
#[cfg(feature = "day13")]
mod day13;
#[cfg(feature = "day14")]
mod day14;
fn main() -> eyre::Result<()> {
color_eyre::install()?;
tracing_subscriber::fmt()
.with_env_filter(EnvFilter::from_default_env())
.init();
#[cfg(feature = "day1")]
solve_day(1, day01::pt1, day01::pt2);
#[cfg(feature = "day2")]
solve_day(2, day02::pt1, day02::pt2);
#[cfg(feature = "day3")]
solve_day(3, day03::pt1, day03::pt2);
#[cfg(feature = "day4")]
solve_day(4, day04::pt1, day04::pt2);
#[cfg(feature = "day5")]
solve_day(5, day05::pt1, day05::pt2);
#[cfg(feature = "day6")]
solve_day(6, day06::pt1, day06::pt2);
#[cfg(feature = "day7")]
solve_day(7, day07::pt1, day07::pt2);
#[cfg(feature = "day8")]
solve_day(8, day08::pt1, day08::pt2);
#[cfg(feature = "day9")]
solve_day(9, day09::pt1, day09::pt2);
#[cfg(feature = "day10")]
solve_day(10, day10::pt1, day10::pt2);
#[cfg(feature = "day11")]
solve_day(11, day11::pt1, day11::pt2);
#[cfg(feature = "day12")]
solve_day(12, day12::pt1, day12::pt2);
#[cfg(feature = "day13")]
solve_day(13, day13::pt1, day13::pt2);
#[cfg(feature = "day14")]
solve_day(14, day14::pt1, day14::pt2);
Ok(())
}
fn solve_day<Fa, Fb, Ta, Tb>(day: u8, part_a: Fa, part_b: Fb)
where
Fa: Fn(&str) -> Ta,
Ta: Display,
Fb: Fn(&str) -> Tb,
Tb: Display,
{
match read_to_string(format!("./inputs/day{day:02}/input.txt")) {
Ok(input) => {
let start = Instant::now();
let result_a = part_a(&input);
tracing::info!("[{day:02}] Part A: {result_a} \tin {:?}", start.elapsed());
let start = Instant::now();
let result_b = part_b(&input);
tracing::info!("[{day:02}] Part B: {result_b} \tin {:?}", start.elapsed());
}
Err(_) => {
tracing::warn!("could not open ./inputs/day{day:02}/input.txt");
}
}
}