Files
AdventOfCode/y2025/src/days/d3.rs
2025-12-15 18:14:52 +01:00

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);
}
}