2023-12-02 13:06:07 +00:00
|
|
|
fn main () {
|
|
|
|
let data: String = std::fs::read_to_string("input").unwrap();
|
|
|
|
let lines = data.lines();
|
|
|
|
|
2023-12-02 13:36:50 +00:00
|
|
|
let sum: u32 = lines.map(|line| { get_calibration_values(line) }).sum();
|
|
|
|
println!("the sum of all calibration values is {sum}!");
|
2023-12-02 13:06:07 +00:00
|
|
|
}
|
|
|
|
|
2023-12-02 15:16:08 +00:00
|
|
|
fn replace_numbers(line: &str) -> String {
|
2023-12-02 13:06:07 +00:00
|
|
|
let numbers: [&str; 10] = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
|
2023-12-02 13:36:50 +00:00
|
|
|
let mut processed: String = String::from(line);
|
2023-12-02 13:06:07 +00:00
|
|
|
loop {
|
|
|
|
let mut clean = false;
|
|
|
|
for i in 0..numbers.len() {
|
2023-12-02 13:36:50 +00:00
|
|
|
let old_line = processed.clone();
|
|
|
|
processed = processed.replace(numbers[i], i.to_string().as_str());
|
|
|
|
if processed == old_line {
|
2023-12-02 13:06:07 +00:00
|
|
|
clean = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if clean {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2023-12-02 13:36:50 +00:00
|
|
|
processed
|
2023-12-02 13:06:07 +00:00
|
|
|
}
|
|
|
|
|
2023-12-02 13:36:50 +00:00
|
|
|
fn get_calibration_values(raw_line: &str) -> u32 {
|
|
|
|
let line: String = replace_numbers(raw_line);
|
2023-12-02 13:06:07 +00:00
|
|
|
|
|
|
|
let first: u32 = line.chars().find_map(|ch| { ch.to_digit(10) }).unwrap();
|
|
|
|
let last: u32 = line.chars().rev().find_map(|ch| { ch.to_digit(10) }).unwrap();
|
|
|
|
|
|
|
|
let result = first * 10 + last;
|
|
|
|
println!("{line} ({result})");
|
|
|
|
|
|
|
|
// first * 10 + last
|
|
|
|
result
|
2023-12-02 13:36:50 +00:00
|
|
|
}
|