:)

deduping

+13 -28
+13 -28
src/day3.rs
··· 1 1 pub fn day3_part1(input: &str) -> String { 2 2 let batteries = parse(input); 3 - let sum: u64 = batteries.iter().map(|bank| max_joltage(bank)).sum(); 3 + let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 2)).sum(); 4 4 sum.to_string() 5 5 } 6 6 pub fn day3_part2(input: &str) -> String { 7 7 let batteries = parse(input); 8 - let sum: u64 = batteries.iter().map(|bank| max_12_joltage(bank)).sum(); 8 + let sum: u64 = batteries.iter().map(|bank| max_joltage(bank, 12)).sum(); 9 9 sum.to_string() 10 10 } 11 11 12 - fn max_12_joltage(bank: &[u64]) -> u64 { 12 + fn max_joltage(bank: &[u8], battery_count: usize) -> u64 { 13 13 let bank_length = bank.len(); 14 - let mut digits = Vec::with_capacity(12); 14 + let mut digits = Vec::with_capacity(battery_count); 15 15 let mut cursor = 0; 16 - for place in 0..12 { 17 - let max_digit = bank[cursor..bank_length - (12 - (place + 1))] 18 - .iter() 19 - .max() 20 - .unwrap(); 21 - let index_of_max_digit = bank[cursor..bank_length - (12 - (place + 1))] 16 + for place in 0..battery_count { 17 + let range = cursor..bank_length - (battery_count - (place + 1)); 18 + let (index_of_max_digit, max_digit) = bank[range] 22 19 .iter() 23 20 .enumerate() 24 - .find(|(_, digit)| *digit == max_digit) 25 - .unwrap() 26 - .0; 21 + .max_by_key(|(index, digit)| (*digit, bank_length - index)) 22 + .unwrap(); 27 23 cursor = index_of_max_digit + cursor + 1; 28 24 digits.push(max_digit) 29 25 } 30 26 31 - digits.into_iter().fold(0, |acc, digit| acc * 10 + digit) 32 - } 33 - 34 - fn max_joltage(bank: &[u64]) -> u64 { 35 - let bank_length = bank.len(); 36 - let max_digit_not_final = bank[..bank_length - 1].iter().max().unwrap(); 37 - let index_of_max_digit = bank 27 + digits 38 28 .iter() 39 - .enumerate() 40 - .find(|(_, digit)| *digit == max_digit_not_final) 41 - .unwrap() 42 - .0; 43 - let max_ones = bank[index_of_max_digit + 1..].iter().max().unwrap(); 44 - *max_digit_not_final * 10 + max_ones 29 + .fold(0, |acc, &&digit| acc * 10 + digit as u64) 45 30 } 46 31 47 - fn parse(input: &str) -> Vec<Vec<u64>> { 32 + fn parse(input: &str) -> Vec<Vec<u8>> { 48 33 input 49 34 .lines() 50 35 .map(|bank| { 51 36 bank.chars() 52 - .map(|c| c.to_digit(10).unwrap() as u64) 37 + .map(|c| c.to_digit(10).unwrap() as u8) 53 38 .collect() 54 39 }) 55 40 .collect()