use std::fs::File; use std::io::{self, BufRead, BufReader}; use regex::Regex; use regex::RegexSet; use once_cell::sync::Lazy; fn map(s: &str) -> i32 { match s { "zero" => 0, "one" => 1, "two" => 2, "three" => 3, "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8, "nine" => 9, "0" => 0, "1" => 1, "2" => 2, "3" => 3, "4" => 4, "5" => 5, "6" => 6, "7" => 7, "8" => 8, "9" => 9, _ => unreachable!() } } fn get(s: &str) -> i32 { static RE: Lazy = Lazy::new(|| Regex::new(r"^.*?(zero|one|two|three|four|five|six|seven|eight|nine|0|1|2|3|4|5|6|7|8|9)").unwrap()); static RER: Lazy = Lazy::new(|| Regex::new(r"^.*?(9|8|7|6|5|4|3|2|1|0|enin|thgie|neves|xis|evif|ruof|eerht|owt|eno|orez)").unwrap()); let rev = s.chars().rev().collect::(); let Some(caps) = RE.captures(s) else { return -1; }; let a = map(&caps[1]); let Some(caps) = RER.captures(&rev) else { return -1; }; let t = caps[1].chars().rev().collect::(); let b = map(&t); return 10 * a + b; } fn main() -> anyhow::Result<()> { let file = File::open("input")?; let reader = BufReader::new(file); let mut sum = 0; for line in reader.lines() { let l = line?; let m = get(&l); sum += m; } println!("{}", sum); Ok(()) }