From 252bbf3cdae064ee1bc56ec818bb7544366a000f Mon Sep 17 00:00:00 2001 From: Keenan Tims Date: Fri, 5 Dec 2025 00:26:39 -0800 Subject: [PATCH] day5: part2 --- .aoc_tiles/tiles/2025/05.png | Bin 6988 -> 7796 bytes README.md | 2 +- src/day5.rs | 108 +++++++++++++++++++++++++++++++++-- src/lib.rs | 1 + 4 files changed, 104 insertions(+), 7 deletions(-) diff --git a/.aoc_tiles/tiles/2025/05.png b/.aoc_tiles/tiles/2025/05.png index fd91c3e724019f19641fb3535b96fb16135b5637..6723ab7eacdaf3c3743b4494c2497cb340afe414 100644 GIT binary patch literal 7796 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

- 2025 - 9 ⭐ - Rust + 2025 - 10 ⭐ - Rust

diff --git a/src/day5.rs b/src/day5.rs index 0ffc29a..a2f6131 100644 --- a/src/day5.rs +++ b/src/day5.rs @@ -1,3 +1,5 @@ +use std::cmp::{max, min}; +use std::fmt::Debug; use std::ops::RangeInclusive; use aoc_runner_derive::{aoc, aoc_generator}; @@ -7,18 +9,94 @@ struct Database { available_ingredients: Vec, } -#[aoc_generator(day5)] +struct Database2 { + fresh_ingredients: Vec, +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct Span { + start: u64, + end: u64, +} + +impl From<(u64, u64)> for Span { + fn from(value: (u64, u64)) -> Self { + Self { + start: value.0, + end: value.1, + } + } +} + +impl Span { + fn len(&self) -> u64 { + self.end - self.start + 1 + } +} + +struct RangeSet { + ranges: Vec, +} + +impl RangeSet { + fn new() -> Self { + Self { ranges: Vec::new() } + } + fn simplify(&mut self) { + // sort the ranges by start + if self.ranges.len() < 2 { + return; + } + let mut modified = true; + while modified { + let mut new_ranges = Vec::new(); + modified = false; + self.ranges.sort_by_key(|s| s.start); + for chunk in self.ranges.chunks(2) { + if chunk.len() == 1 { + new_ranges.push(chunk[0].clone()); + continue; + } + let (l, r) = (&chunk[0], &chunk[1]); + if r.start <= l.end + 1 { + modified = true; + new_ranges.push((min(r.start, l.start), max(l.end, r.end)).into()) + } else { + new_ranges.push(l.clone()); + new_ranges.push(r.clone()); + } + } + if !self.ranges.len().is_multiple_of(2) && new_ranges.len() >= 2 { + let (l, r) = (new_ranges.pop().unwrap(), new_ranges.pop().unwrap()); + if r.start <= l.end + 1 && r.end >= l.start - 1 { + modified = true; + new_ranges.push((min(r.start, l.start), max(l.end, r.end)).into()) + } else { + new_ranges.push(l.clone()); + new_ranges.push(r.clone()); + } + } + self.ranges = new_ranges; + } + } + fn add(&mut self, s: Span) { + self.ranges.push(s); + self.simplify() + } +} + +#[aoc_generator(day5, part1)] fn parse(input: &str) -> Database { let mut fresh_ingredients = Vec::new(); let mut available_ingredients = Vec::new(); let mut parsing_ranges = true; for line in input.lines() { - if line == "" { + if line.is_empty() { parsing_ranges = false; continue; } if parsing_ranges { - let (start, end) = line.split_once(|c| c == '-').unwrap(); + let (start, end) = line.split_once('-').unwrap(); fresh_ingredients.push(RangeInclusive::new( start.parse().unwrap(), end.parse().unwrap(), @@ -33,6 +111,19 @@ fn parse(input: &str) -> Database { } } +#[aoc_generator(day5, part2)] +fn parse2(input: &str) -> Database2 { + let mut fresh_ingredients = Vec::new(); + for line in input.lines() { + if line.is_empty() { + return Database2 { fresh_ingredients }; + } + let (start, end) = line.split_once('-').unwrap(); + fresh_ingredients.push((start.parse().unwrap(), end.parse().unwrap()).into()); + } + Database2 { fresh_ingredients } +} + #[aoc(day5, part1)] fn part1(input: &Database) -> u64 { input @@ -43,8 +134,13 @@ fn part1(input: &Database) -> u64 { } #[aoc(day5, part2)] -fn part2(input: &Database) -> u64 { - 0 +fn part2(input: &Database2) -> u64 { + let mut all_ingredients = RangeSet::new(); + for r in &input.fresh_ingredients { + all_ingredients.add(r.clone()) + } + + all_ingredients.ranges.iter().map(|r| r.len()).sum::() } #[cfg(test)] @@ -70,6 +166,6 @@ mod tests { #[test] fn part2_example() { - assert_eq!(part2(&parse(EXAMPLE)), 0); + assert_eq!(part2(&parse2(EXAMPLE)), 14); } } diff --git a/src/lib.rs b/src/lib.rs index 3961a65..1bb311f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,6 +2,7 @@ mod day1; mod day2; mod day3; mod day4; +mod day5; use aoc_runner_derive::aoc_lib;