First day
[advent_of_code_2023.git] / src / main.rs
1 use std::time::Instant;
2
3 use clap::Parser;
4 use rayon::prelude::*;
5
6 mod day01;
7 mod days;
8
9 #[derive(Parser, Debug)]
10 #[command(author = "Greg Burri", version = "1.0", about = "Advent of Code 2023")]
11 struct Args {
12 #[arg(index(1), exclusive(true))]
13 day: Option<usize>,
14
15 #[arg(short, long)]
16 parallel: bool,
17 }
18
19 fn main() {
20 println!("https://adventofcode.com/2023");
21
22 let days: Vec<fn() -> String> = vec![days::day01];
23
24 let args = Args::parse();
25
26 match args.day {
27 Some(day) => {
28 if day >= 1 && day <= days.len() {
29 do_day(&days, day)
30 } else {
31 println!("Unknown day: {}", day)
32 }
33 }
34 // No argument -> execute all day problems.
35 None => {
36 let now = Instant::now();
37
38 if args.parallel {
39 (1..=days.len())
40 .into_par_iter()
41 .for_each(|d| do_day(&days, d));
42 } else {
43 (1..=days.len()).for_each(|d| do_day(&days, d));
44 }
45
46 println!(
47 "Time to execute all days: {}",
48 format_micros(now.elapsed().as_micros())
49 );
50 }
51 }
52 }
53
54 fn do_day(days: &[fn() -> String], day: usize) {
55 let now = Instant::now();
56 println!(
57 "Result of day {:02}: {} (time: {})",
58 day,
59 days[day - 1](),
60 format_micros(now.elapsed().as_micros())
61 );
62 }
63
64 fn format_micros(t: u128) -> String {
65 if t < 10_000 {
66 format!("{} μs", t)
67 } else if t < 10_000_000u128 {
68 format!("{:.2} ms", t as f64 / 1e3f64)
69 } else {
70 format!("{:.2} s", t as f64 / 1e6f64)
71 }
72 }