diff --git a/advent_of_code/2023/1/src/main.rs b/advent_of_code/2023/1/src/main.rs index 6428df8..f9bb65f 100644 --- a/advent_of_code/2023/1/src/main.rs +++ b/advent_of_code/2023/1/src/main.rs @@ -21,6 +21,111 @@ fn solve_1(input: &str) -> u32 { .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!"); @@ -29,6 +134,10 @@ fn main() { 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)] @@ -41,4 +150,11 @@ mod tests { 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); + } } diff --git a/advent_of_code/2023/1/test2.txt b/advent_of_code/2023/1/test2.txt new file mode 100644 index 0000000..4316a6b --- /dev/null +++ b/advent_of_code/2023/1/test2.txt @@ -0,0 +1,7 @@ +two1nine +eightwothree +abcone2threexyz +xtwone3four +4nineeightseven2 +zoneight234 +7pqrstsixteen \ No newline at end of file