Skip to content

Commit 3ce3563

Browse files
committed
solve: day9
1 parent cadcda0 commit 3ce3563

File tree

3 files changed

+102
-1
lines changed

3 files changed

+102
-1
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
resolver = "2"
33
members = [
44
"aoc_lib/aoc_derive",
5-
"aoc_lib/utils", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8",
5+
"aoc_lib/utils", "day1", "day2", "day3", "day4", "day5", "day6", "day7", "day8", "day9",
66
]
77

88
[workspace.dependencies]

day9/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "day9"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
aoc_derive.path = '../aoc_lib/aoc_derive'
8+
utils.path = '../aoc_lib/utils'
9+
derive_more.workspace = true
10+
itertools.workspace = true
11+
lazy-regex.workspace = true
12+
parse-display.workspace = true
13+
rayon.workspace = true
14+
regex.workspace = true
15+
num.workspace = true
16+
17+
[dev-dependencies]
18+
pretty_assertions.workspace = true

day9/src/main.rs

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
use std::ops::RangeInclusive;
2+
3+
use aoc_derive::aoc_main;
4+
use itertools::Itertools;
5+
use utils::math::Vec2D;
6+
use utils::*;
7+
8+
#[derive(Debug, Clone, PartialEq, Eq)]
9+
struct Rect {
10+
range_x: RangeInclusive<i64>,
11+
range_y: RangeInclusive<i64>,
12+
}
13+
14+
impl Rect {
15+
fn new(a: &Vec2D, b: &Vec2D) -> Self {
16+
Self { range_x: a.x.min(b.x)..=a.x.max(b.x), range_y: a.y.min(b.y)..=a.y.max(b.y) }
17+
}
18+
19+
fn area(&self) -> i64 {
20+
(self.range_x.try_len().unwrap() * self.range_y.try_len().unwrap()) as i64
21+
}
22+
23+
fn intersects(&self, (v1, v2): &(Vec2D, Vec2D)) -> bool {
24+
let vx = v1.x.min(v2.x)..=v1.x.max(v2.x);
25+
let vy = v1.y.min(v2.y)..=v1.y.max(v2.y);
26+
27+
if vx.end() <= self.range_x.start() || vx.start() >= self.range_x.end() {
28+
return false;
29+
}
30+
31+
if vy.end() <= self.range_y.start() || vy.start() >= self.range_y.end() {
32+
return false;
33+
}
34+
35+
true
36+
}
37+
}
38+
39+
fn part2(poly: &[Vec2D]) -> i64 {
40+
let vertices: Vec<(Vec2D, Vec2D)> = poly.iter().copied().circular_tuple_windows().collect();
41+
42+
poly.iter()
43+
.tuple_combinations()
44+
.map(|(a, b)| Rect::new(a, b))
45+
.filter(|rect| vertices.iter().all(|v| !rect.intersects(v)))
46+
.map(|r| r.area())
47+
.max()
48+
.unwrap()
49+
}
50+
51+
#[aoc_main]
52+
fn solve(input: Input) -> impl Into<Solution> {
53+
let poly = input
54+
.lines()
55+
.map(|line| {
56+
let (x, y) = extract_numbers(line).collect_tuple().unwrap();
57+
Vec2D::new(x, y)
58+
})
59+
.collect_vec();
60+
61+
(poly.iter().tuple_combinations().map(|(a, b)| Rect::new(a, b).area()).max(), part2(&poly))
62+
}
63+
64+
#[cfg(test)]
65+
mod tests {
66+
use super::*;
67+
#[test]
68+
fn test_examples() {
69+
use utils::assert_example;
70+
assert_example!(
71+
r#"7,1
72+
11,1
73+
11,7
74+
9,7
75+
9,5
76+
2,5
77+
2,3
78+
7,3"#,
79+
50,
80+
24
81+
);
82+
}
83+
}

0 commit comments

Comments
 (0)