62 lines
1.3 KiB
Rust
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;
|
|
}
|