From 1e6757ea103457b8ce9a65a0b182837686e2e080 Mon Sep 17 00:00:00 2001 From: Ben C Date: Wed, 11 Dec 2024 05:36:11 +0000 Subject: [PATCH] Day 10 & 11 --- years/2024/src/day_10.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ years/2024/src/day_11.rs | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ years/2024/src/examples/day_10/1.txt | 8 ++++++++ years/2024/src/examples/day_10/2.txt | 8 ++++++++ years/2024/src/examples/day_11/1.txt | 1 + years/2024/src/examples/day_11/2.txt | 1 + 6 file(s) changed, 187 insertion(s)(+), 12 deletion(s)(-) diff --git a/years/2024/src/day_10.rs b/years/2024/src/day_10.rs --- a/years/2024/src/day_10.rs +++ b/years/2024/src/day_10.rs @@ -1,17 +1,80 @@ +use std::collections::HashSet; -use advent_core::{Day, day_stuff, ex_for_day}; +use advent_core::{day_stuff, ex_for_day, Day}; +use utils::{dir::CARDINALS, pos::Position}; pub struct Day10; +#[derive(Clone, Debug)] +pub struct Tile(usize); + +impl From for Tile { + fn from(value: char) -> Self { + Self(value.to_string().parse().unwrap()) + } +} + +pub type Grid = utils::grid::Grid; + +fn get_asc(g: &Grid, pos: Position, num: usize) -> impl Iterator + use<'_> { + g.relatives(pos, &CARDINALS) + .filter_map(move |(_, r_pos, t)| if t.0 == num + 1 { Some(r_pos) } else { None }) +} + impl Day for Day10 { + day_stuff!(10, "36", "81", Grid); - day_stuff!(10, "", ""); + fn part_1(input: Self::Input) -> Option { + let starts = input + .iter() + .filter_map(|(p, t)| if t.0 == 0 { Some(p) } else { None }); + + let mut tot = 0; + + for start in starts { + let mut num = 0; + let mut nxt = vec![start]; + while num != 9 { + nxt = nxt + .into_iter() + .flat_map(|o| get_asc(&input, o, num)) + .collect::>(); + num += 1; + } + + let hsh = nxt.into_iter().collect::>(); + + tot += hsh.len(); + } + + Some(tot.to_string()) + } + + fn part_2(input: Self::Input) -> Option { + let starts = input + .iter() + .filter_map(|(p, t)| if t.0 == 0 { Some(p) } else { None }); + + let mut tot = 0; + + for start in starts { + let mut num = 0; + let mut nxt = vec![start]; + while num != 9 { + nxt = nxt + .into_iter() + .flat_map(|o| get_asc(&input, o, num)) + .collect::>(); + num += 1; + } - fn part_1(_input: Self::Input) -> Option { - None + tot += nxt.len(); + } + + Some(tot.to_string()) } - fn part_2(_input: Self::Input) -> Option { - None + fn parse_input(input: &str) -> Self::Input { + Grid::parse(input.trim()) } } diff --git a/years/2024/src/day_11.rs b/years/2024/src/day_11.rs --- a/years/2024/src/day_11.rs +++ b/years/2024/src/day_11.rs @@ -1,17 +1,111 @@ +use std::collections::HashMap; -use advent_core::{Day, day_stuff, ex_for_day}; +use advent_core::{day_stuff, ex_for_day, Day}; pub struct Day11; impl Day for Day11 { + day_stuff!(11, "55312", "65601038650482", Vec); - day_stuff!(11, "", ""); + fn part_1(input: Self::Input) -> Option { + let l = input.len(); + let mut stone_map = input + .into_iter() + .fold(HashMap::with_capacity(l), |mut acc, stone| { + acc.entry(stone).and_modify(|c| *c += 1).or_insert(1); + acc + }); + + for _i in 0..25 { + let mut new_map = HashMap::with_capacity(stone_map.len()); + + for (num, count) in stone_map { + if num == 0 { + new_map + .entry(1) + .and_modify(|c| *c += count) + .or_insert(count); + } else { + let ss = num.to_string(); + let l = ss.len(); + if l % 2 == 0 { + let (num1, num2) = + (ss[..l / 2].parse().unwrap(), ss[l / 2..].parse().unwrap()); + new_map + .entry(num1) + .and_modify(|c| *c += count) + .or_insert(count); + new_map + .entry(num2) + .and_modify(|c| *c += count) + .or_insert(count); + } else { + new_map + .entry(num * 2024) + .and_modify(|c| *c += count) + .or_insert(count); + } + } + } - fn part_1(_input: Self::Input) -> Option { - None + stone_map = new_map; + } + + Some(stone_map.values().sum::().to_string()) } - fn part_2(_input: Self::Input) -> Option { - None + fn part_2(input: Self::Input) -> Option { + let l = input.len(); + let mut stone_map = input + .into_iter() + .fold(HashMap::with_capacity(l), |mut acc, stone| { + acc.entry(stone).and_modify(|c| *c += 1).or_insert(1); + acc + }); + + for _i in 0..75 { + let mut new_map = HashMap::with_capacity(stone_map.len()); + + for (num, count) in stone_map { + if num == 0 { + new_map + .entry(1) + .and_modify(|c| *c += count) + .or_insert(count); + } else { + let ss = num.to_string(); + let l = ss.len(); + if l % 2 == 0 { + let (num1, num2) = + (ss[..l / 2].parse().unwrap(), ss[l / 2..].parse().unwrap()); + new_map + .entry(num1) + .and_modify(|c| *c += count) + .or_insert(count); + new_map + .entry(num2) + .and_modify(|c| *c += count) + .or_insert(count); + } else { + new_map + .entry(num * 2024) + .and_modify(|c| *c += count) + .or_insert(count); + } + } + } + + stone_map = new_map; + } + + Some(stone_map.values().sum::().to_string()) + } + + fn parse_input(input: &str) -> Self::Input { + input + .trim() + .split(" ") + .map(|n| n.parse::().unwrap()) + .collect() } } diff --git a/years/2024/src/examples/day_10/1.txt b/years/2024/src/examples/day_10/1.txt --- a/years/2024/src/examples/day_10/1.txt +++ b/years/2024/src/examples/day_10/1.txt @@ -0,0 +1,8 @@ +89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732 diff --git a/years/2024/src/examples/day_10/2.txt b/years/2024/src/examples/day_10/2.txt --- a/years/2024/src/examples/day_10/2.txt +++ b/years/2024/src/examples/day_10/2.txt @@ -0,0 +1,8 @@ +89010123 +78121874 +87430965 +96549874 +45678903 +32019012 +01329801 +10456732 diff --git a/years/2024/src/examples/day_11/1.txt b/years/2024/src/examples/day_11/1.txt --- a/years/2024/src/examples/day_11/1.txt +++ b/years/2024/src/examples/day_11/1.txt @@ -0,0 +1,1 @@ +125 17 diff --git a/years/2024/src/examples/day_11/2.txt b/years/2024/src/examples/day_11/2.txt --- a/years/2024/src/examples/day_11/2.txt +++ b/years/2024/src/examples/day_11/2.txt @@ -0,0 +1,1 @@ +125 17 -- tangled.sh