11use aoc:: util:: ansi:: * ;
22use aoc:: util:: parse:: * ;
3- use aoc:: * ;
43use std:: env:: args;
54use std:: fs:: read_to_string;
6- use std:: iter:: empty;
75use std:: time:: { Duration , Instant } ;
86
97fn main ( ) {
108 // 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. iter_unsigned ( ) . collect :: < Vec < u32 > > ( ) ) ;
1410 let ( year, day) = ( iter. next ( ) , iter. next ( ) ) ;
1511
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+
1625 // 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 ) )
3031 . fold ( ( 0 , Duration :: ZERO ) , |( stars, duration) , Solution { year, day, wrapper } | {
3132 let path = format ! ( "input/year{year}/day{day:02}.txt" ) ;
3233
3334 if let Ok ( data) = read_to_string ( & path) {
3435 let instant = Instant :: now ( ) ;
35- let ( part1, part2) = wrapper ( data) ;
36+ let ( part1, part2) = wrapper ( & data) ;
3637 let elapsed = instant. elapsed ( ) ;
3738
3839 println ! ( "{BOLD}{YELLOW}{year} Day {day}{RESET}" ) ;
@@ -50,16 +51,16 @@ fn main() {
5051 } ) ;
5152
5253 // 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}" ) ;
5556 println ! ( "{BOLD}{WHITE}🕓 {} ms{RESET}" , duration. as_millis( ) ) ;
5657 }
5758}
5859
5960struct Solution {
6061 year : u32 ,
6162 day : u32 ,
62- wrapper : fn ( String ) -> ( String , String ) ,
63+ wrapper : fn ( & str ) -> ( String , String ) ,
6364}
6465
6566macro_rules! run {
@@ -68,8 +69,8 @@ macro_rules! run {
6869 vec![ $( {
6970 let year = stringify!( $year) . unsigned( ) ;
7071 let day = stringify!( $day) . unsigned( ) ;
71- let wrapper = |data: String | {
72- use $year:: $day:: * ;
72+ let wrapper = |data: & str | {
73+ use aoc :: $year:: $day:: * ;
7374
7475 let input = parse( & data) ;
7576 let part1 = part1( & input) ;
0 commit comments