2021-12-01 14:12:36 +01:00
use std ::env ;
2021-12-09 00:26:00 +01:00
#[ cfg(not(debug_assertions)) ]
use std ::ops ::{ AddAssign , MulAssign } ;
#[ cfg(debug_assertions) ]
use std ::{
fmt ::{ Debug , Display } ,
str ::FromStr ,
} ;
2021-11-22 14:30:40 +01:00
pub fn read_file ( day : usize ) -> String {
2021-12-01 23:12:39 +01:00
std ::fs ::read_to_string ( env ::var ( " AOC_INPUT " ) . unwrap_or_else ( | _ | format! ( " inputs/day {:0>2} " , day ) ) ) . unwrap ( )
2021-11-22 14:30:40 +01:00
}
pub fn parse_nums ( l : & str ) -> Vec < usize > {
2021-12-06 11:01:23 +01:00
l . lines ( ) . map ( parse_num ) . collect ( )
2021-12-01 06:19:33 +01:00
}
pub fn parse_nums_comma ( l : & str ) -> Vec < usize > {
2021-12-06 13:46:34 +01:00
l . trim ( ) . split ( ',' ) . map ( parse_num ) . collect ( )
2021-12-06 11:01:23 +01:00
}
2021-12-09 00:26:00 +01:00
#[ cfg(debug_assertions) ]
pub fn parse_num < T : FromStr < Err : Debug > + Display > ( s : & str ) -> T {
2021-12-06 13:46:34 +01:00
s . parse ( ) . unwrap_or_else ( | e | panic! ( " Invalid number {s} : {e:?} " ) )
2021-11-22 14:30:40 +01:00
}
2021-12-09 00:26:00 +01:00
#[ cfg(not(debug_assertions)) ]
pub fn parse_num < T : From < u8 > + AddAssign < T > + MulAssign < T > > ( s : & str ) -> T {
let mut digits = s . bytes ( ) . map ( | b | T ::from ( b - b '0' ) ) ;
let mut n = digits . next ( ) . unwrap ( ) ;
for digit in digits {
n * = T ::from ( 10 ) ;
n + = digit ;
}
n
}