@@ -4,22 +4,17 @@ use aoc::*;
44use std:: env:: args;
55use std:: fs:: read_to_string;
66use std:: iter:: empty;
7- use std:: path:: { Path , PathBuf } ;
87use std:: time:: { Duration , Instant } ;
98
109fn 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
6359struct Solution {
6460 year : u32 ,
6561 day : u32 ,
66- path : PathBuf ,
6762 wrapper : fn ( String ) -> ( String , String ) ,
6863}
6964
7065macro_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