159 lines
5.3 KiB
Rust
159 lines
5.3 KiB
Rust
pub fn process_part1(input: &str) -> u32 {
|
|
input
|
|
.lines()
|
|
.map(|line| {
|
|
let line_len = line.len();
|
|
let nums = line.chars().map(|char| char.to_digit(10).unwrap());
|
|
let mut highest = (0, 0);
|
|
for (idx, num) in nums.enumerate() {
|
|
if num > highest.0 && idx + 1 != line_len {
|
|
highest.0 = num;
|
|
highest.1 = 0;
|
|
} else if num > highest.1 {
|
|
highest.1 = num;
|
|
}
|
|
}
|
|
highest.0 * 10 + highest.1
|
|
})
|
|
.sum()
|
|
}
|
|
|
|
pub fn process_part2(input: &str) -> u64 {
|
|
input
|
|
.lines()
|
|
.map(|line| {
|
|
let line_len = line.len();
|
|
let nums = line.chars().map(|char| char.to_digit(10).unwrap() as u64);
|
|
let mut highest = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
for (idx, num) in nums.enumerate() {
|
|
if num > highest.0 && idx + 1 < line_len - 10 {
|
|
highest.0 = num;
|
|
highest.1 = 0;
|
|
highest.2 = 0;
|
|
highest.3 = 0;
|
|
highest.4 = 0;
|
|
highest.5 = 0;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.1 && idx + 1 < line_len - 9 {
|
|
highest.1 = num;
|
|
highest.2 = 0;
|
|
highest.3 = 0;
|
|
highest.4 = 0;
|
|
highest.5 = 0;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.2 && idx + 1 < line_len - 8 {
|
|
highest.2 = num;
|
|
highest.3 = 0;
|
|
highest.4 = 0;
|
|
highest.5 = 0;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.3 && idx + 1 < line_len - 7 {
|
|
highest.3 = num;
|
|
highest.4 = 0;
|
|
highest.5 = 0;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.4 && idx + 1 < line_len - 6 {
|
|
highest.4 = num;
|
|
highest.5 = 0;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.5 && idx + 1 < line_len - 5 {
|
|
highest.5 = num;
|
|
highest.6 = 0;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.6 && idx + 1 < line_len - 4 {
|
|
highest.6 = num;
|
|
highest.7 = 0;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.7 && idx + 1 < line_len - 3 {
|
|
highest.7 = num;
|
|
highest.8 = 0;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.8 && idx + 1 < line_len - 2 {
|
|
highest.8 = num;
|
|
highest.9 = 0;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.9 && idx + 1 < line_len - 1 {
|
|
highest.9 = num;
|
|
highest.10 = 0;
|
|
highest.11 = 0;
|
|
} else if num > highest.10 && idx + 1 < line_len {
|
|
highest.10 = num;
|
|
highest.11 = 0;
|
|
} else if num > highest.11 {
|
|
highest.11 = num;
|
|
}
|
|
}
|
|
let res = highest.0 * 100000000000
|
|
+ highest.1 * 10000000000
|
|
+ highest.2 * 1000000000
|
|
+ highest.3 * 100000000
|
|
+ highest.4 * 10000000
|
|
+ highest.5 * 1000000
|
|
+ highest.6 * 100000
|
|
+ highest.7 * 10000
|
|
+ highest.8 * 1000
|
|
+ highest.9 * 100
|
|
+ highest.10 * 10
|
|
+ highest.11;
|
|
res
|
|
})
|
|
.sum()
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
const INPUT: &str = "987654321111111
|
|
811111111111119
|
|
234234234234278
|
|
818181911112111";
|
|
|
|
#[test]
|
|
fn part1() {
|
|
let result = process_part1(INPUT);
|
|
assert_eq!(result, 357);
|
|
}
|
|
|
|
#[test]
|
|
fn part2() {
|
|
let result = process_part2(INPUT);
|
|
assert_eq!(result, 3121910778619);
|
|
}
|
|
}
|