use std::env; #[cfg(not(debug_assertions))] use std::ops::{AddAssign, MulAssign}; #[cfg(debug_assertions)] use std::{ fmt::{Debug, Display}, str::FromStr, }; pub fn read_file(day: usize) -> String { std::fs::read_to_string(env::var("AOC_INPUT").unwrap_or_else(|_| format!("inputs/day{:0>2}", day))).unwrap() } pub fn parse_nums(l: &str) -> Vec { l.lines().map(parse_num).collect() } pub fn parse_nums_comma(l: &str) -> Vec { l.trim().split(',').map(parse_num).collect() } #[cfg(debug_assertions)] pub fn parse_num + Display>(s: &str) -> T { s.parse().unwrap_or_else(|e| panic!("Invalid number {s}: {e:?}")) } #[cfg(not(debug_assertions))] pub fn parse_num + AddAssign + MulAssign>(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 }