fn solve_1(input: &str) -> u32 { input .lines() .map(|l| { // Digits are 0-9, so we know that if they // are still 10 they haven't been changed let mut first = 10; let mut last = 10; for c in l.chars() { if let Some(digit) = c.to_digit(10) { if first == 10 { first = digit; } last = digit; } } first * 10 + last }) .sum() } fn digitify(chars: &str) -> u32 { let mut chars_left = &chars[..]; while chars_left.len() > 0 { if chars_left.len() >= 3 { if let Some(digit) = chars_left.chars().next().unwrap().to_digit(10) { return digit; } else if &chars_left[0..3] == "one" { return 1; } else if &chars_left[0..3] == "two" { return 2; } else if &chars_left[0..3] == "six" { return 6; } else if chars_left.len() >= 4 { if &chars_left[0..4] == "four" { return 4; } else if &chars_left[0..4] == "five" { return 5; } else if &chars_left[0..4] == "nine" { return 9; } else if chars_left.len() >= 5 { if &chars_left[0..5] == "three" { return 3; } else if &chars_left[0..5] == "seven" { return 7; } else if &chars_left[0..5] == "eight" { return 8; } else { chars_left = &chars_left[1..]; } } else { chars_left = &chars_left[1..]; } } else { chars_left = &chars_left[1..]; } } else if let Some(digit) = chars_left.chars().next().unwrap().to_digit(10) { return digit; } else { chars_left = &chars_left[1..]; } } return 0; } fn digitify_backwards(line: &str) -> u32 { let chars_left = line.chars().rev().collect::(); let mut chars_left = chars_left.as_str(); while chars_left.len() > 0 { if chars_left.len() >= 3 { if let Some(digit) = chars_left.chars().next().unwrap().to_digit(10) { return digit; } else if &chars_left[0..3] == "eno" { return 1; } else if &chars_left[0..3] == "owt" { return 2; } else if &chars_left[0..3] == "xis" { return 6; } else if chars_left.len() >= 4 { if &chars_left[0..4] == "ruof" { return 4; } else if &chars_left[0..4] == "evif" { return 5; } else if &chars_left[0..4] == "enin" { return 9; } else if chars_left.len() >= 5 { if &chars_left[0..5] == "eerht" { return 3; } else if &chars_left[0..5] == "neves" { return 7; } else if &chars_left[0..5] == "thgie" { return 8; } else { chars_left = &chars_left[1..]; } } else { chars_left = &chars_left[1..]; } } else { chars_left = &chars_left[1..]; } } else if let Some(digit) = chars_left.chars().next().unwrap().to_digit(10) { return digit; } else { chars_left = &chars_left[1..]; } } return 0; } fn solve_2(input: &str) -> u32 { input .lines() .map(|l| { let first = digitify(&l[..]); let last = digitify_backwards(&l[..]); first * 10 + last }) .sum() } fn main() { println!("Hello, this is Patrick!"); let input_txt = include_str!("../input.txt"); let result_1 = solve_1(input_txt); println!("The sum of all calibration values is {}", result_1); let result_2 = solve_2(input_txt); println!("The sum of all improved calibration values is {}", result_2); } #[cfg(test)] mod tests { use super::*; #[test] fn test_1() { let test_input = include_str!("../test.txt"); assert_eq!(solve_1(test_input), 142); } #[test] fn test_2() { let test_input = include_str!("../test2.txt"); assert_eq!(solve_2(test_input), 281); } }