2022-11-29 12:29:49 +01:00
pub fn read_file ( day : usize ) -> String {
2022-12-15 20:50:38 +01:00
std ::fs ::read_to_string ( std ::env ::var ( " AOC_INPUT " ) . unwrap_or_else ( | _ | format! ( " inputs/day {day:0>2} " ) ) ) . unwrap ( )
2022-11-29 12:29:49 +01:00
}
pub fn parse_nums ( l : & str ) -> Vec < usize > {
l . lines ( ) . map ( parse_num ) . collect ( )
}
pub fn parse_nums_comma ( l : & str ) -> Vec < usize > {
l . trim ( ) . split ( ',' ) . map ( parse_num ) . collect ( )
}
2022-12-01 10:21:16 +01:00
#[ cfg(debug_assertions) ]
pub fn parse_num < T : std ::str ::FromStr + std ::fmt ::Display > ( s : & str ) -> T {
2022-11-29 12:29:49 +01:00
s . parse ( ) . unwrap_or_else ( | _ | panic! ( " Invalid number {s} " ) )
}
2022-12-01 10:21:16 +01:00
// For benchmarks.
// This function assumes that the input will always be valid numbers and is UB otherwise
#[ cfg(not(debug_assertions)) ]
pub fn parse_num < T : From < u8 > + std ::ops ::Add < T , Output = T > + std ::ops ::Mul < T , Output = T > > ( s : & str ) -> T {
let mut digits = s . bytes ( ) . map ( | b | T ::from ( b - b '0' ) ) ;
let start = unsafe { digits . next ( ) . unwrap_unchecked ( ) } ;
digits . fold ( start , | acc , n | acc * T ::from ( 10 ) + n )
}