@@ -4,22 +4,18 @@ use aoc::*;
4
4
use std:: env:: args;
5
5
use std:: fs:: read_to_string;
6
6
use std:: iter:: empty;
7
- use std:: path:: { Path , PathBuf } ;
7
+ use std:: path:: Path ;
8
8
use std:: time:: { Duration , Instant } ;
9
9
10
10
fn main ( ) {
11
11
// 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 ( ) ) ;
20
16
21
- // Filter solutions
22
- let solutions : Vec < _ > = empty ( )
17
+ // Filter solutions then pretty print output.
18
+ let ( stars , duration ) = empty ( )
23
19
. chain ( year2015 ( ) )
24
20
. chain ( year2016 ( ) )
25
21
. chain ( year2017 ( ) )
@@ -30,40 +26,40 @@ fn main() {
30
26
. chain ( year2022 ( ) )
31
27
. chain ( year2023 ( ) )
32
28
. 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
+ } ) ;
55
52
56
53
// 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 ) ;
59
56
println ! ( "{BOLD}{WHITE}🕓 {} ms{RESET}" , duration. as_millis( ) ) ;
60
57
}
61
58
}
62
59
63
60
struct Solution {
64
- year : u32 ,
65
- day : u32 ,
66
- path : PathBuf ,
61
+ year : & ' static str ,
62
+ day : & ' static str ,
67
63
wrapper : fn ( String ) -> ( String , String ) ,
68
64
}
69
65
@@ -73,8 +69,6 @@ macro_rules! run {
73
69
vec![ $( {
74
70
let year = stringify!( $year) ;
75
71
let day = stringify!( $day) ;
76
- let path = Path :: new( "input" ) . join( year) . join( day) . with_extension( "txt" ) ;
77
-
78
72
let wrapper = |data: String | {
79
73
use $year:: $day:: * ;
80
74
@@ -85,7 +79,7 @@ macro_rules! run {
85
79
( part1. to_string( ) , part2. to_string( ) )
86
80
} ;
87
81
88
- Solution { year: year . unsigned ( ) , day: day . unsigned ( ) , path , wrapper }
82
+ Solution { year, day, wrapper }
89
83
} , ) * ]
90
84
}
91
85
}
0 commit comments