From 69ea94bec09e00c01d770a3624ce3ed266566a2b Mon Sep 17 00:00:00 2001 From: Lars Martens Date: Fri, 12 Dec 2025 07:13:50 +0100 Subject: [PATCH] Solve 12 --- src/bin/12.rs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/bin/12.rs diff --git a/src/bin/12.rs b/src/bin/12.rs new file mode 100644 index 0000000..e0974d5 --- /dev/null +++ b/src/bin/12.rs @@ -0,0 +1,82 @@ +use aoc::*; +use glam::USizeVec2; +use itertools::Itertools; + +fn main() { + let input = include_str!("../../input/12"); + println!("Part 1: {}", part1(input)); +} + +fn part1(input: &str) -> usize { + let (presents, regions) = parse_input(input); + regions.into_iter().filter(|r| r.fits(&presents)).count() +} + +fn parse_input(input: &str) -> (Vec, Vec) { + let chunks = input.split("\n\n").collect_vec(); + let (presents, regions) = chunks.split_at(chunks.len() - 1); + let presents = presents.iter().map(|p| Present::parse(p)).collect(); + let regions = regions + .iter() + .flat_map(|chunk| chunk.lines()) + .map(Region::parse) + .collect(); + (presents, regions) +} + +#[derive(Copy, Clone)] +struct Present { + area: usize, +} + +impl Present { + fn parse(input: &str) -> Self { + let area = input + .lines() + .skip(1) + .flat_map(|line| line.chars()) + .filter(|&c| c == '#') + .count(); + Self { area } + } +} + +struct Region { + size: USizeVec2, + presents: Vec, +} + +impl Region { + fn fits(&self, presents: &[Present]) -> bool { + let total_present_area: usize = self + .pick_presents(presents) + .into_iter() + .map(|(n, present)| n * present.area) + .sum(); + total_present_area <= self.area() + } + + fn pick_presents(&self, presents: &[Present]) -> Vec<(usize, Present)> { + self.presents + .iter() + .copied() + .enumerate() + .map(|(i, n)| (n, presents[i])) + .collect() + } + + fn area(&self) -> usize { + self.size.x * self.size.y + } + + fn parse(line: &str) -> Self { + let (size, presents) = line.split_once(": ").unwrap(); + + let (x, y) = size.split_once('x').unwrap(); + let size = USizeVec2::new(x.parse().unwrap(), y.parse().unwrap()); + + let presents = parse_ws_separated(presents).collect(); + + Self { size, presents } + } +}