advent_of_code/year2015/
day20.rs1use crate::input::Input;
2
3pub fn solve(input: &Input) -> Result<u32, String> {
4 let target_presents = input
5 .text
6 .parse::<u32>()
7 .map_err(|e| format!("Could not parse house number: {e}"))?;
8
9 let present_multiplier = input.part_values(10, 11);
10 let max_visits = input.part_values(usize::MAX, 50);
11
12 let highest_house_number = target_presents / present_multiplier;
13 let mut presents = vec![0; highest_house_number as usize];
14
15 for elf_number in 1..highest_house_number {
16 for house_number in (elf_number..highest_house_number)
17 .step_by(elf_number as usize)
18 .take(max_visits)
19 {
20 presents[house_number as usize] += elf_number * present_multiplier;
21 }
22 }
23
24 presents
25 .iter()
26 .enumerate()
27 .find(|&(_index, ¤t)| current >= target_presents)
28 .map(|(index, _current)| index as u32)
29 .ok_or_else(|| "No solution found".to_string())
30}
31
32#[test]
33pub fn tests() {
34 use crate::input::{test_part_one, test_part_two};
35
36 let real_input = include_str!("day20_input.txt");
37 test_part_one!(real_input => 786_240);
38 test_part_two!(real_input => 831_600);
39}