@@ -4,9 +4,8 @@ use aoc::*;
44use std:: env:: args;
55use std:: fs:: read_to_string;
66use std:: iter:: empty;
7- use std:: path:: PathBuf ;
8- use std:: time:: Duration ;
9- use std:: time:: Instant ;
7+ use std:: path:: { Path , PathBuf } ;
8+ use std:: time:: { Duration , Instant } ;
109
1110fn main ( ) {
1211 // Parse command line options
@@ -20,7 +19,7 @@ fn main() {
2019 } ;
2120
2221 // Filter solutions
23- let solutions: Vec < _ > = empty ( )
22+ let solutions = empty ( )
2423 . chain ( year2015 ( ) )
2524 . chain ( year2016 ( ) )
2625 . chain ( year2017 ( ) )
@@ -30,27 +29,26 @@ fn main() {
3029 . chain ( year2021 ( ) )
3130 . chain ( year2022 ( ) )
3231 . chain ( year2023 ( ) )
33- . filter ( |solution| year == Some ( solution. year ) || year. is_none ( ) )
34- . filter ( |solution| day == Some ( solution. day ) || day. is_none ( ) )
35- . collect ( ) ;
32+ . filter ( |solution| year. is_none ( ) || year == Some ( solution. year ) )
33+ . filter ( |solution| day. is_none ( ) || day == Some ( solution. day ) ) ;
3634
3735 // Pretty print output and timing for each solution
38- let mut elapsed = Duration :: ZERO ;
39-
40- for Solution { year, day, wrapper } in & solutions {
41- let path: PathBuf =
42- [ "input" , & format ! ( "year{year}" ) , & format ! ( "day{day:02}.txt" ) ] . iter ( ) . collect ( ) ;
36+ let mut solved = 0 ;
37+ let mut duration = Duration :: ZERO ;
4338
39+ for Solution { year, day, path, wrapper } in solutions {
4440 if let Ok ( data) = read_to_string ( & path) {
45- let time = Instant :: now ( ) ;
46- let ( answer1, answer2) = wrapper ( & data) ;
47- let duration = time. elapsed ( ) . as_micros ( ) ;
48- elapsed += time. elapsed ( ) ;
41+ let instant = Instant :: now ( ) ;
42+ let ( part1, part2) = wrapper ( data) ;
43+ let elapsed = instant. elapsed ( ) ;
44+
45+ solved += 1 ;
46+ duration += elapsed;
4947
5048 println ! ( "{BOLD}{YELLOW}{year} Day {day:02}{RESET}" ) ;
51- println ! ( " Part 1: {answer1 }" ) ;
52- println ! ( " Part 2: {answer2 }" ) ;
53- println ! ( " Duration : {duration } μs" ) ;
49+ println ! ( " Part 1: {part1 }" ) ;
50+ println ! ( " Part 2: {part2 }" ) ;
51+ println ! ( " Elapsed : {} μs" , elapsed . as_micros ( ) ) ;
5452 } else {
5553 eprintln ! ( "{BOLD}{RED}{year} Day {day:02}{RESET}" ) ;
5654 eprintln ! ( " Missing input!" ) ;
@@ -59,32 +57,35 @@ fn main() {
5957 }
6058
6159 // Print totals
62- println ! ( "{BOLD}{RED}Solutions : {}{RESET}" , solutions . len ( ) ) ;
63- println ! ( "{BOLD}{GREEN}Elapsed : {} ms{RESET}" , elapsed . as_millis( ) ) ;
60+ println ! ( "{BOLD}{RED}Solved : {solved }{RESET}" ) ;
61+ println ! ( "{BOLD}{GREEN}Duration : {} ms{RESET}" , duration . as_millis( ) ) ;
6462}
6563
6664struct Solution {
6765 year : u32 ,
6866 day : u32 ,
69- wrapper : fn ( & str ) -> ( String , String ) ,
67+ path : PathBuf ,
68+ wrapper : fn ( String ) -> ( String , String ) ,
7069}
7170
7271macro_rules! solution {
73- ( $year: tt, $day: tt) => {
74- Solution {
75- year: ( & stringify!( $year) ) . unsigned( ) ,
76- day: ( & stringify!( $day) ) . unsigned( ) ,
77- wrapper: |data: & str | {
78- use $year:: $day:: * ;
72+ ( $year: tt, $day: tt) => { {
73+ let year = stringify!( $year) ;
74+ let day = stringify!( $day) ;
75+ let path = Path :: new( "input" ) . join( year) . join( day) . with_extension( "txt" ) ;
7976
80- let input = parse( & data) ;
81- let part1 = part1( & input) . to_string( ) ;
82- let part2 = part2( & input) . to_string( ) ;
77+ let wrapper = |data: String | {
78+ use $year:: $day:: * ;
8379
84- ( part1, part2)
85- } ,
86- }
87- } ;
80+ let input = parse( & data) ;
81+ let part1 = part1( & input) ;
82+ let part2 = part2( & input) ;
83+
84+ ( part1. to_string( ) , part2. to_string( ) )
85+ } ;
86+
87+ Solution { year: year. unsigned( ) , day: day. unsigned( ) , path, wrapper }
88+ } } ;
8889}
8990
9091fn year2015 ( ) -> Vec < Solution > {
0 commit comments