1
0
Fork 0
This commit is contained in:
Lars Martens 2025-12-12 07:13:50 +01:00
parent 180bdf9ce2
commit 69ea94bec0
Signed by: haselkern
GPG key ID: B5CF1F363C179AD4

82
src/bin/12.rs Normal file
View file

@ -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<Present>, Vec<Region>) {
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<usize>,
}
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 }
}
}