Advent of Code solutions
at main 56 lines 1.6 kB view raw
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}