advent_of_code/year2015/
day20.rs

1use 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, &current)| 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}