1
1
use aoc:: util:: ansi:: * ;
2
2
use aoc:: util:: parse:: * ;
3
- use aoc:: * ;
4
3
use std:: env:: args;
5
4
use std:: fs:: read_to_string;
6
- use std:: iter:: empty;
7
5
use std:: time:: { Duration , Instant } ;
8
6
9
7
fn main ( ) {
10
8
// Parse command line options
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 > ( ) ) ;
9
+ let mut iter = args ( ) . flat_map ( |arg| arg. as_str ( ) . iter_unsigned ( ) . collect :: < Vec < u32 > > ( ) ) ;
14
10
let ( year, day) = ( iter. next ( ) , iter. next ( ) ) ;
15
11
12
+ let solutions = [
13
+ year2015 ( ) ,
14
+ year2016 ( ) ,
15
+ year2017 ( ) ,
16
+ year2018 ( ) ,
17
+ year2019 ( ) ,
18
+ year2020 ( ) ,
19
+ year2021 ( ) ,
20
+ year2022 ( ) ,
21
+ year2023 ( ) ,
22
+ year2024 ( ) ,
23
+ ] ;
24
+
16
25
// Filter solutions then pretty print output.
17
- let ( stars, duration) = empty ( )
18
- . chain ( year2015 ( ) )
19
- . chain ( year2016 ( ) )
20
- . chain ( year2017 ( ) )
21
- . chain ( year2018 ( ) )
22
- . chain ( year2019 ( ) )
23
- . chain ( year2020 ( ) )
24
- . chain ( year2021 ( ) )
25
- . chain ( year2022 ( ) )
26
- . chain ( year2023 ( ) )
27
- . chain ( year2024 ( ) )
28
- . filter ( |solution| year. is_none_or ( |y| y == solution. year ) )
29
- . filter ( |solution| day. is_none_or ( |d| d == solution. day ) )
26
+ let ( stars, duration) = solutions
27
+ . into_iter ( )
28
+ . flatten ( )
29
+ . filter ( |s| year. is_none_or ( |y| y == s. year ) )
30
+ . filter ( |s| day. is_none_or ( |d| d == s. day ) )
30
31
. fold ( ( 0 , Duration :: ZERO ) , |( stars, duration) , Solution { year, day, wrapper } | {
31
32
let path = format ! ( "input/year{year}/day{day:02}.txt" ) ;
32
33
33
34
if let Ok ( data) = read_to_string ( & path) {
34
35
let instant = Instant :: now ( ) ;
35
- let ( part1, part2) = wrapper ( data) ;
36
+ let ( part1, part2) = wrapper ( & data) ;
36
37
let elapsed = instant. elapsed ( ) ;
37
38
38
39
println ! ( "{BOLD}{YELLOW}{year} Day {day}{RESET}" ) ;
@@ -50,16 +51,16 @@ fn main() {
50
51
} ) ;
51
52
52
53
// Optionally print totals.
53
- if args. contains ( & "--totals" ) {
54
- println ! ( "{BOLD}{YELLOW}⭐ {}{RESET}" , stars ) ;
54
+ if args ( ) . any ( |arg| arg == "--totals" ) {
55
+ println ! ( "{BOLD}{YELLOW}⭐ {stars }{RESET}" ) ;
55
56
println ! ( "{BOLD}{WHITE}🕓 {} ms{RESET}" , duration. as_millis( ) ) ;
56
57
}
57
58
}
58
59
59
60
struct Solution {
60
61
year : u32 ,
61
62
day : u32 ,
62
- wrapper : fn ( String ) -> ( String , String ) ,
63
+ wrapper : fn ( & str ) -> ( String , String ) ,
63
64
}
64
65
65
66
macro_rules! run {
@@ -68,8 +69,8 @@ macro_rules! run {
68
69
vec![ $( {
69
70
let year = stringify!( $year) . unsigned( ) ;
70
71
let day = stringify!( $day) . unsigned( ) ;
71
- let wrapper = |data: String | {
72
- use $year:: $day:: * ;
72
+ let wrapper = |data: & str | {
73
+ use aoc :: $year:: $day:: * ;
73
74
74
75
let input = parse( & data) ;
75
76
let part1 = part1( & input) ;
0 commit comments