Skip to content

Commit f178be6

Browse files
committed
Tidy main method
1 parent 2533f7f commit f178be6

File tree

1 file changed

+34
-41
lines changed

1 file changed

+34
-41
lines changed

src/main.rs

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,17 @@ 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};
87
use std::time::{Duration, Instant};
98

109
fn main() {
1110
// Parse command line options
12-
let (year, day) = match args().nth(1) {
13-
Some(arg) => {
14-
let str = arg.as_str();
15-
let mut iter = str.iter_unsigned();
16-
(iter.next(), iter.next())
17-
}
18-
None => (None, None),
19-
};
11+
let args: Vec<_> = args().collect();
12+
let args: Vec<_> = args.iter().map(String::as_str).collect();
13+
let mut iter = args.iter().flat_map(|arg| arg.iter_unsigned::<u32>());
14+
let (year, day) = (iter.next(), iter.next());
2015

21-
// Filter solutions
22-
let solutions: Vec<_> = empty()
16+
// Filter solutions then pretty print output.
17+
let (stars, duration) = empty()
2318
.chain(year2015())
2419
.chain(year2016())
2520
.chain(year2017())
@@ -30,51 +25,49 @@ fn main() {
3025
.chain(year2022())
3126
.chain(year2023())
3227
.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-
}
28+
.filter(|solution| year.is_none_or(|y| y == solution.year))
29+
.filter(|solution| day.is_none_or(|d| d == solution.day))
30+
.fold((0, Duration::ZERO), |(stars, duration), Solution { year, day, wrapper }| {
31+
let path = format!("input/year{year}/day{day:02}.txt");
32+
33+
if let Ok(data) = read_to_string(&path) {
34+
let instant = Instant::now();
35+
let (part1, part2) = wrapper(data);
36+
let elapsed = instant.elapsed();
37+
38+
println!("{BOLD}{YELLOW}{year} Day {day}{RESET}");
39+
println!(" Part 1: {part1}");
40+
println!(" Part 2: {part2}");
41+
42+
(stars + 2, duration + elapsed)
43+
} else {
44+
eprintln!("{BOLD}{RED}{year} Day {day}{RESET}");
45+
eprintln!(" Missing input!");
46+
eprintln!(" Place input file in {BOLD}{WHITE}{path}{RESET}");
47+
48+
(stars, duration)
49+
}
50+
});
5551

5652
// Optionally print totals.
57-
if args().any(|a| a == "--totals") {
58-
println!("{BOLD}{YELLOW}⭐ {}{RESET}", 2 * solutions.len());
53+
if args.contains(&"--totals") {
54+
println!("{BOLD}{YELLOW}⭐ {}{RESET}", stars);
5955
println!("{BOLD}{WHITE}🕓 {} ms{RESET}", duration.as_millis());
6056
}
6157
}
6258

6359
struct Solution {
6460
year: u32,
6561
day: u32,
66-
path: PathBuf,
6762
wrapper: fn(String) -> (String, String),
6863
}
6964

7065
macro_rules! run {
7166
($year:tt $($day:tt),*) => {
7267
fn $year() -> Vec<Solution> {
7368
vec![$({
74-
let year = stringify!($year);
75-
let day = stringify!($day);
76-
let path = Path::new("input").join(year).join(day).with_extension("txt");
77-
69+
let year = stringify!($year).unsigned();
70+
let day = stringify!($day).unsigned();
7871
let wrapper = |data: String| {
7972
use $year::$day::*;
8073

@@ -85,7 +78,7 @@ macro_rules! run {
8578
(part1.to_string(), part2.to_string())
8679
};
8780

88-
Solution { year: year.unsigned(), day: day.unsigned(), path, wrapper }
81+
Solution { year, day, wrapper }
8982
},)*]
9083
}
9184
}

0 commit comments

Comments
 (0)