advent-of-code/src/year_2023/day_01_trebuchet/part_two.rs

62 lines
1.3 KiB
Rust

use std::collections::HashMap;
use crate::utils::input_reader;
pub fn part_two() -> String {
if let Ok(lines) = input_reader::read_lines("./input/2023/day_01/input.txt") {
let mut result = 0;
for line in lines {
result += parse_line(&line.unwrap());
}
result.to_string()
} else {
panic!("Failed to read lines from input file");
}
}
fn parse_line(s: &str) -> u32 {
const RADIX: u32 = 10;
let digits: HashMap<&str, u32> = HashMap::from([
("one", 1),
("two", 2),
("three", 3),
("four", 4),
("five", 5),
("six", 6),
("seven", 7),
("eight", 8),
("nine", 9),
]);
let mut first_digit = 0;
let mut last_digit = 0;
for i in 0..s.len() {
let c = s.chars().nth(i).unwrap();
if c.is_digit(RADIX) {
let digit = c.to_digit(RADIX).unwrap();
if first_digit == 0 {
first_digit = digit;
}
last_digit = digit;
} else {
for (k, v) in digits.iter() {
if s[i..].starts_with(k) {
if first_digit == 0 {
first_digit = *v;
}
last_digit = *v;
}
}
}
}
return first_digit * 10 + last_digit;
}