pub fn process_part1(input: u32) -> u32 { // slow //let mut house = 1; //loop { // let mut presents = 0; // for elf in 1..=house { // if house % elf == 0 { // presents += elf * 10; // println!("{house} {presents}"); // } // } // if presents >= input { // break; // } // house += 1; //} //house let mut house = 0; loop { house += 1; let mut divisors = get_divisors(house); divisors.push(house); if divisors.iter().sum::() * 10 >= input as usize { break; } } house as u32 } fn get_divisors(n: usize) -> Vec { let mut divisors = vec![1]; let mut potential_divisor = 2; while (potential_divisor * potential_divisor) < n { if n % potential_divisor == 0 { divisors.push(potential_divisor); divisors.push(n / potential_divisor); } potential_divisor += 1; } // This almost made me go mad if potential_divisor * potential_divisor == n { divisors.push(potential_divisor) } divisors } pub fn process_part2(input: u32) -> u32 { let mut house = 0; loop { house += 1; let mut divisors = get_divisors(house); divisors.push(house); let sum = divisors.iter().filter(|&&d| house / d <= 50).sum::(); if sum * 11 >= input as usize { break; } } house as u32 } #[cfg(test)] mod tests { use super::*; #[test] fn part1() { let result = process_part1(100); assert_eq!(result, 6); } }