Skip to content

Commit 6633d57

Browse files
committed
Tidy run scaffolding
1 parent 2533f7f commit 6633d57

File tree

1 file changed

+31
-33
lines changed

1 file changed

+31
-33
lines changed

src/main.rs

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,22 @@ use aoc::*;
44
use std::env::args;
55
use std::fs::read_to_string;
66
use std::iter::empty;
7-
use std::path::{Path, PathBuf};
7+
use std::path::Path;
88
use std::time::{Duration, Instant};
99

1010
fn main() {
1111
// Parse command line options
1212
let (year, day) = match args().nth(1) {
1313
Some(arg) => {
1414
let str = arg.as_str();
15-
let mut iter = str.iter_unsigned();
15+
let mut iter = str.iter_unsigned::<u32>();
1616
(iter.next(), iter.next())
1717
}
1818
None => (None, None),
1919
};
2020

21-
// Filter solutions
22-
let solutions: Vec<_> = empty()
21+
// Filter solutions then pretty print output.
22+
let (stars, duration) = empty()
2323
.chain(year2015())
2424
.chain(year2016())
2525
.chain(year2017())
@@ -30,40 +30,40 @@ fn main() {
3030
.chain(year2022())
3131
.chain(year2023())
3232
.chain(year2024())
33-
.filter(|solution| year.is_none_or(|y: u32| y == solution.year))
34-
.filter(|solution| day.is_none_or(|d: u32| d == solution.day))
35-
.collect();
36-
37-
// Pretty print output for each solution.
38-
let mut duration = Duration::ZERO;
39-
40-
for Solution { year, day, path, wrapper } in &solutions {
41-
if let Ok(data) = read_to_string(path) {
42-
let instant = Instant::now();
43-
let (part1, part2) = wrapper(data);
44-
duration += instant.elapsed();
45-
46-
println!("{BOLD}{YELLOW}{year} Day {day:02}{RESET}");
47-
println!(" Part 1: {part1}");
48-
println!(" Part 2: {part2}");
49-
} else {
50-
eprintln!("{BOLD}{RED}{year} Day {day:02}{RESET}");
51-
eprintln!(" Missing input!");
52-
eprintln!(" Place input file in {BOLD}{WHITE}{}{RESET}", path.display());
53-
}
54-
}
33+
.filter(|solution| year.is_none_or(|y| y == solution.year.unsigned()))
34+
.filter(|solution| day.is_none_or(|d| d == solution.day.unsigned()))
35+
.fold((0, Duration::ZERO), |(stars, duration), Solution { year, day, wrapper }| {
36+
let path = Path::new("input").join(year).join(day).with_extension("txt");
37+
38+
if let Ok(data) = read_to_string(&path) {
39+
let instant = Instant::now();
40+
let (part1, part2) = wrapper(data);
41+
let elapsed = instant.elapsed();
42+
43+
println!("{BOLD}{YELLOW}{} Day {}{RESET}", &year[4..], &day[3..]);
44+
println!(" Part 1: {part1}");
45+
println!(" Part 2: {part2}");
46+
47+
(stars + 2, duration + elapsed)
48+
} else {
49+
eprintln!("{BOLD}{RED}{} Day {}{RESET}", &year[4..], &day[3..]);
50+
eprintln!(" Missing input!");
51+
eprintln!(" Place input file in {BOLD}{WHITE}{}{RESET}", path.display());
52+
53+
(stars, duration)
54+
}
55+
});
5556

5657
// Optionally print totals.
5758
if args().any(|a| a == "--totals") {
58-
println!("{BOLD}{YELLOW}⭐ {}{RESET}", 2 * solutions.len());
59+
println!("{BOLD}{YELLOW}⭐ {}{RESET}", stars);
5960
println!("{BOLD}{WHITE}🕓 {} ms{RESET}", duration.as_millis());
6061
}
6162
}
6263

6364
struct Solution {
64-
year: u32,
65-
day: u32,
66-
path: PathBuf,
65+
year: &'static str,
66+
day: &'static str,
6767
wrapper: fn(String) -> (String, String),
6868
}
6969

@@ -73,8 +73,6 @@ macro_rules! run {
7373
vec![$({
7474
let year = stringify!($year);
7575
let day = stringify!($day);
76-
let path = Path::new("input").join(year).join(day).with_extension("txt");
77-
7876
let wrapper = |data: String| {
7977
use $year::$day::*;
8078

@@ -85,7 +83,7 @@ macro_rules! run {
8583
(part1.to_string(), part2.to_string())
8684
};
8785

88-
Solution { year: year.unsigned(), day: day.unsigned(), path, wrapper }
86+
Solution { year, day, wrapper }
8987
},)*]
9088
}
9189
}

0 commit comments

Comments
 (0)