From 9098100658f857b36ee9df227fb3da5c813f315e Mon Sep 17 00:00:00 2001 From: Ben C Date: Thu, 5 Dec 2024 00:57:26 -0500 Subject: [PATCH] Day 5 --- years/2024/src/day_5.rs | 76 +++++++++++++++++++++++++++-- years/2024/src/examples/day_5/1.txt | 28 +++++++++++ years/2024/src/examples/day_5/2.txt | 28 +++++++++++ 3 files changed, 127 insertions(+), 5 deletions(-) diff --git a/years/2024/src/day_5.rs b/years/2024/src/day_5.rs index a87ca56..d8d4640 100644 --- a/years/2024/src/day_5.rs +++ b/years/2024/src/day_5.rs @@ -1,17 +1,83 @@ +use std::collections::{HashMap, HashSet}; + use advent_core::{Day, day_stuff, ex_for_day}; pub struct Day5; +#[derive(Clone, Debug)] +pub struct Rules(HashMap>); + +impl Rules { + pub fn take(&mut self, lhs: i64, rhs: i64) { + self.0.entry(lhs).and_modify(|seen| { seen.push(rhs); }).or_insert(vec![rhs]); + } + + fn good(&self, up: &[i64]) -> bool { + let mut seen = HashSet::new(); + for u in up.iter() { + if self.0.get(u).is_none_or(|should| should.iter().all(|s| !seen.contains(s))) { + seen.insert(*u); + } else { + return false; + } + } + true + } + + fn sort_to_rules(&self, up: &mut[i64]) { + while !self.good(up) { + self.sort_step(up); + } + } + + fn sort_step(&self, up: &mut[i64]) { + for i in 0..up.len()-1 { + for j in i+1..up.len() { + if self.0.get(&up[j]).is_some_and(|shld| shld.contains(&up[i])) { + up.swap(i, j); + } + } + } + } +} + impl Day for Day5 { - day_stuff!(5, "", ""); + day_stuff!(5, "143", "123", (Rules, Vec>)); - fn part_1(_input: Self::Input) -> Option { - None + fn part_1(input: Self::Input) -> Option { + let (rules, updates) = input; + let ans = updates.into_iter().filter_map(|up| { + if rules.good(&up) { + Some(up[up.len() / 2]) + } else { + None + } + }).sum::(); + Some(ans.to_string()) } - fn part_2(_input: Self::Input) -> Option { - None + fn part_2(input: Self::Input) -> Option { + let (rules, updates) = input; + let ans = updates.into_iter().filter_map(|mut up| { + if !rules.good(&up) { + rules.sort_to_rules(&mut up); + Some(up[up.len() / 2]) + } else { + None + } + }).sum::(); + Some(ans.to_string()) + } + + fn parse_input(input: &str) -> Self::Input { + let (rules, updates) = input.split_once("\n\n").unwrap(); + let mut rules_o = Rules(HashMap::with_capacity(50)); + for l in rules.lines() { + let (lhs, rhs) = l.split_once('|').unwrap(); + rules_o.take(lhs.parse().unwrap(), rhs.parse().unwrap()); + } + (rules_o, updates.split('\n').map(|l| l.split(',').map(|x| x.parse().unwrap()).collect()).collect()) } } diff --git a/years/2024/src/examples/day_5/1.txt b/years/2024/src/examples/day_5/1.txt index e69de29..d4d4441 100644 --- a/years/2024/src/examples/day_5/1.txt +++ b/years/2024/src/examples/day_5/1.txt @@ -0,0 +1,28 @@ +47|53 +97|13 +97|61 +97|47 +75|29 +61|13 +75|53 +29|13 +97|29 +53|29 +61|53 +97|53 +61|29 +47|13 +75|47 +97|75 +47|61 +75|61 +47|29 +75|13 +53|13 + +75,47,61,53,29 +97,61,53,29,13 +75,29,13 +75,97,47,61,53 +61,13,29 +97,13,75,29,47 \ No newline at end of file diff --git a/years/2024/src/examples/day_5/2.txt b/years/2024/src/examples/day_5/2.txt index e69de29..d4d4441 100644 --- a/years/2024/src/examples/day_5/2.txt +++ b/years/2024/src/examples/day_5/2.txt @@ -0,0 +1,28 @@ +47|53 +97|13 +97|61 +97|47 +75|29 +61|13 +75|53 +29|13 +97|29 +53|29 +61|53 +97|53 +61|29 +47|13 +75|47 +97|75 +47|61 +75|61 +47|29 +75|13 +53|13 + +75,47,61,53,29 +97,61,53,29,13 +75,29,13 +75,97,47,61,53 +61,13,29 +97,13,75,29,47 \ No newline at end of file -- 2.51.2