Advent of Code solutions
1use std::collections::HashMap;
2
3use advent_core::{day_stuff, ex_for_day, Day};
4use utils::num::{num_digits, split_num_once};
5
6pub struct Day11;
7
8pub fn do_blinks(stones: Vec<usize>, blinks: usize) -> usize {
9 let l = stones.len();
10 let mut stone_map = stones
11 .into_iter()
12 .fold(HashMap::with_capacity(l), |mut acc, stone| {
13 *acc.entry(stone).or_insert(0) += 1;
14 acc
15 });
16
17 for _i in 0..blinks {
18 let mut new_map = HashMap::with_capacity(stone_map.len() * 2);
19
20 for (num, count) in stone_map {
21 if num == 0 {
22 *new_map.entry(1).or_insert(0) += count;
23 } else if num_digits(num).is_multiple_of(2) {
24 let (left, right) = split_num_once(num);
25 *new_map.entry(left).or_insert(0) += count;
26 *new_map.entry(right).or_insert(0) += count;
27 } else {
28 *new_map.entry(num * 2024).or_insert(0) += count;
29 }
30 }
31
32 stone_map = new_map;
33 }
34
35 stone_map.into_values().sum::<usize>()
36}
37
38impl Day for Day11 {
39 day_stuff!(11, "55312", "65601038650482", Vec<usize>);
40
41 fn part_1(input: Self::Input) -> Option<String> {
42 Some(do_blinks(input, 25).to_string())
43 }
44
45 fn part_2(input: Self::Input) -> Option<String> {
46 Some(do_blinks(input, 75).to_string())
47 }
48
49 fn parse_input(input: &str) -> Self::Input {
50 input
51 .trim()
52 .split(" ")
53 .map(|n| n.parse::<usize>().unwrap())
54 .collect()
55 }
56}