-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.rs
84 lines (73 loc) · 1.95 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#![feature(iter_array_chunks)]
#![feature(array_windows)]
#![feature(get_many_mut)]
#![feature(coroutines)]
#![feature(iter_from_coroutine)]
use std::time::Duration;
use clap::Parser;
mod aoc2019;
mod aoc2021;
mod aoc2022;
mod aoc2023;
mod helpers;
mod traits;
use helpers::{Results, TimingData};
#[derive(Parser)]
#[command(version = "1.0", author = "Paul C. <[email protected]>")]
struct Options {
/// Use test input
#[arg(long)]
test: bool,
/// Advent year
#[arg(long, default_value = "2023")]
year: u32,
/// Advent day
#[arg(long)]
day: Option<u32>,
}
fn run_day(
year: u32,
day: u32,
test: bool,
) -> Result<Option<TimingData>, Box<dyn std::error::Error>> {
let (input_path, results) = if test {
(format!("./inputs/{year}/day{day}_test.txt"), None)
} else {
(
format!("./inputs/{year}/day{day}.txt"),
Some(Results::parse(year)?),
)
};
let input = std::fs::read_to_string(input_path)?;
let year_runner = match year {
2019 => aoc2019::run_solution_for_day,
2021 => aoc2021::run_solution_for_day,
2022 => aoc2022::run_solution_for_day,
2023 => aoc2023::run_solution_for_day,
_ => panic!("undefined year {year}"),
};
Ok(year_runner(day, &input, results))
}
fn run_all(year: u32, test: bool) {
let mut total = Duration::ZERO;
for day in 1..=25 {
if let Ok(Some(elapsed)) = run_day(year, day, test) {
total += elapsed.part1 + elapsed.part2;
}
}
println!("Total: {total:?}");
}
fn main() {
let opts = Options::parse();
if let Some(day) = opts.day {
match run_day(opts.year, day, opts.test) {
Ok(None) => {
panic!("no solution available for that day ({day})")
}
Ok(Some(_)) => {}
Err(err) => panic!("Error loading day: {err}"),
}
} else {
run_all(opts.year, opts.test)
}
}