use regex::Regex; pub fn run() { let input = include_str!("../input/day1.txt"); // let input = r#"1abc2 // pqr3stu8vwx // a1b2c3d4e5f // treb7uchet"#; // let input = r#"two1nine // eightwothree // abcone2threexyz // xtwone3four // 4nineeightseven2 // zoneight234 // 7pqrstsixteen"#; // let sum: u32 = input // .lines() // .filter(|s| !s.is_empty()) // .map(|s| find_digits(s)) // .sum(); // dbg!(sum); dbg!(find_digits_part2("gdgj3f")); let sum2 = input .lines() .filter(|s| !s.is_empty()) .map(|s| find_digits_part2(s)) .sum::(); dbg!(sum2); } fn find_digits(s: &str) -> u32 { let first = s .chars() .nth(s.find(|c: char| c.is_ascii_digit()).unwrap()) .unwrap() .to_digit(10) .unwrap(); let last = s .chars() .nth(s.rfind(|c: char| c.is_ascii_digit()).unwrap()) .unwrap() .to_digit(10) .unwrap(); first * 10 + last } fn find_digits_part2(s: &str) -> u32 { let re = Regex::new("^([1-9]|one|two|three|four|five|six|seven|eight|nine)").unwrap(); let mut s = s.to_owned(); let mut first: Option = None; let mut last: Option = None; while !s.is_empty() { if let Some(m) = re.find(&s) { last = Some(parse_digit(m.as_str())); if first == None { first = last; } } s.remove(0); } return first.unwrap() * 10 + last.unwrap(); } fn parse_digit(s: &str) -> u32 { match s { "one" => 1, "two" => 2, "three" => 3, "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8, "nine" => 9, _ => s.parse().unwrap(), } }