diff --git a/src/day01.rs b/src/day01.rs index 9cd8459..52d7740 100644 --- a/src/day01.rs +++ b/src/day01.rs @@ -1,54 +1,60 @@ use lazy_static::lazy_static; use regex::Regex; -use crate::utils::digit_value; -use crate::Day; +use crate::{utils::digit_value, Day}; +// Register this day in our runner inventory inventory::submit! { Day { number: 1, run } } fn first_and_last_digit(s: &str) -> usize { + // Find the first character in the string that is an ASCII digit let first = s .chars() - .find(|c| c.is_ascii_digit()) - .unwrap() - .to_digit(10) - .unwrap() as usize; + .find(|c| c.is_ascii_digit()) // Use find to get an Option containing the first digit character + .unwrap() // Unwrap the Option, panicking if no digit is found + .to_digit(10) // Convert the character to a digit in base 10 + .unwrap() as usize; // Convert the digit to a usize + + // Find the last character in the string that is an ASCII digit let last = s .chars() - .rfind(|c| c.is_ascii_digit()) - .unwrap() - .to_digit(10) - .unwrap() as usize; + .rfind(|c| c.is_ascii_digit()) // Use rfind to get an Option containing the last digit character + .unwrap() // Unwrap the Option, panicking if no digit is found + .to_digit(10) // Convert the character to a digit in base 10 + .unwrap() as usize; // Convert the digit to a usize + // Return the result first * 10 + last } -fn day01_part1(input: &str) -> usize { - input.lines().map(first_and_last_digit).sum() -} - lazy_static! { static ref REGEX: Regex = Regex::new(r"(?Pzero|one|two|three|four|five|six|seven|eight|nine|\d)").unwrap(); } fn first_and_last_digit_regex(s: &str) -> usize { + // Initialize variables to keep track of the positions and values of the first and last digits. let mut first_start = usize::MAX; let mut last_end = 0; let mut first_digit = String::new(); let mut last_digit = String::new(); + // Iterate over each character index in the string. for (index, _) in s.char_indices() { + // Check if there is a digit at the current index or beyond. if let Some(mat) = REGEX.find(&s[index..]) { + // Calculate the start and end positions of the matched digit. let match_start = index + mat.start(); let match_end = index + mat.end(); + // If the current match starts before any previously found digit, it's the new first digit. if match_start < first_start { first_start = match_start; first_digit = mat.as_str().to_string(); } + // If the current match ends after any previously found digit, it's the new last digit. if match_end > last_end { last_end = match_end; last_digit = mat.as_str().to_string(); @@ -56,10 +62,12 @@ fn first_and_last_digit_regex(s: &str) -> usize { } } - let first_digit_val = digit_value(&first_digit); - let last_digit_val = digit_value(&last_digit); + // Convert the first and last digit strings to their numeric values and return the result + digit_value(&first_digit) * 10 + digit_value(&last_digit) +} - first_digit_val * 10 + last_digit_val +fn day01_part1(input: &str) -> usize { + input.lines().map(first_and_last_digit).sum() } fn day01_part2(input: &str) -> usize {