161 lines
4.6 KiB
Rust
161 lines
4.6 KiB
Rust
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::<String>();
|
|
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);
|
|
}
|
|
}
|