y2025d3
This commit is contained in:
158
y2025/src/days/d3.rs
Normal file
158
y2025/src/days/d3.rs
Normal file
@@ -0,0 +1,158 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user