Skip to content

Commit dea93a5

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

File tree

1 file changed

+35
-41
lines changed

1 file changed

+35
-41
lines changed

src/main.rs

Lines changed: 35 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,18 @@ 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
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-
};
12+
let args: Vec<_> = args().collect();
13+
let args: Vec<_> = args.iter().map(String::as_str).collect();
14+
let mut iter = args.iter().flat_map(|arg| arg.iter_unsigned::<u32>());
15+
let (year, day) = (iter.next(), iter.next());
2016

21-
// Filter solutions
22-
let solutions: Vec<_> = empty()
17+
// Filter solutions then pretty print output.
18+
let (stars, duration) = empty()
2319
.chain(year2015())
2420
.chain(year2016())
2521
.chain(year2017())
@@ -30,40 +26,40 @@ fn main() {
3026
.chain(year2022())
3127
.chain(year2023())
3228
.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-
}
29+
.filter(|solution| year.is_none_or(|y| y == solution.year.unsigned()))
30+
.filter(|solution| day.is_none_or(|d| d == solution.day.unsigned()))
31+
.fold((0, Duration::ZERO), |(stars, duration), Solution { year, day, wrapper }| {
32+
let path = Path::new("input").join(year).join(day).with_extension("txt");
33+
34+
if let Ok(data) = read_to_string(&path) {
35+
let instant = Instant::now();
36+
let (part1, part2) = wrapper(data);
37+
let elapsed = instant.elapsed();
38+
39+
println!("{BOLD}{YELLOW}{} Day {}{RESET}", &year[4..], &day[3..]);
40+
println!(" Part 1: {part1}");
41+
println!(" Part 2: {part2}");
42+
43+
(stars + 2, duration + elapsed)
44+
} else {
45+
eprintln!("{BOLD}{RED}{} Day {}{RESET}", &year[4..], &day[3..]);
46+
eprintln!(" Missing input!");
47+
eprintln!(" Place input file in {BOLD}{WHITE}{}{RESET}", path.display());
48+
49+
(stars, duration)
50+
}
51+
});
5552

5653
// Optionally print totals.
57-
if args().any(|a| a == "--totals") {
58-
println!("{BOLD}{YELLOW}⭐ {}{RESET}", 2 * solutions.len());
54+
if args.contains(&"--totals") {
55+
println!("{BOLD}{YELLOW}⭐ {}{RESET}", stars);
5956
println!("{BOLD}{WHITE}🕓 {} ms{RESET}", duration.as_millis());
6057
}
6158
}
6259

6360
struct Solution {
64-
year: u32,
65-
day: u32,
66-
path: PathBuf,
61+
year: &'static str,
62+
day: &'static str,
6763
wrapper: fn(String) -> (String, String),
6864
}
6965

@@ -73,8 +69,6 @@ macro_rules! run {
7369
vec![$({
7470
let year = stringify!($year);
7571
let day = stringify!($day);
76-
let path = Path::new("input").join(year).join(day).with_extension("txt");
77-
7872
let wrapper = |data: String| {
7973
use $year::$day::*;
8074

@@ -85,7 +79,7 @@ macro_rules! run {
8579
(part1.to_string(), part2.to_string())
8680
};
8781

88-
Solution { year: year.unsigned(), day: day.unsigned(), path, wrapper }
82+
Solution { year, day, wrapper }
8983
},)*]
9084
}
9185
}

0 commit comments

Comments
 (0)