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