Skip to content

Commit 5c7b001

Browse files
committed
AOC 2025 day 9 part 1
1 parent e9194f9 commit 5c7b001

9 files changed

Lines changed: 223 additions & 5 deletions

File tree

adventofcode/src/main/java/org/ck/adventofcode/year2025/Day09.java

Lines changed: 202 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package org.ck.adventofcode.year2025;
22

3-
import java.util.Scanner;
3+
import java.util.*;
44
import org.ck.adventofcode.util.AOCSolution;
55
import org.ck.codechallengelib.annotation.Solution;
66

@@ -20,15 +20,212 @@ public class Day09 extends AOCSolution {
2020

2121
@Override
2222
protected void runPartOne(final Scanner in) {
23-
run(in);
23+
run(in, (_, _, _) -> true);
2424
}
2525

2626
@Override
2727
protected void runPartTwo(final Scanner in) {
28-
run(in);
28+
run(
29+
in,
30+
(current, other, boundingLines) -> {
31+
final long minX = Math.min(current.x, other.x);
32+
final long maxX = Math.max(current.x, other.x);
33+
final long minY = Math.min(current.y, other.y);
34+
final long maxY = Math.max(current.y, other.y);
35+
36+
final Line topLine = new Line(new Coordinate(minX, minY), new Coordinate(maxX, minY));
37+
final Line bottomLine = new Line(new Coordinate(minX, maxY), new Coordinate(maxX, maxY));
38+
final Line leftLine = new Line(new Coordinate(minX, minY), new Coordinate(minX, maxY));
39+
final Line rightLine = new Line(new Coordinate(maxX, minY), new Coordinate(maxX, maxY));
40+
41+
return boundingLines.stream()
42+
.anyMatch(
43+
line ->
44+
topLine.intersectsTopLine(line)
45+
|| bottomLine.intersectsBottomLine(line)
46+
|| leftLine.intersectsLeftLine(line)
47+
|| rightLine.intersectsRightLine(line));
48+
49+
/*
50+
final Coordinate topCorner =
51+
current.y < other.y
52+
? new Coordinate(other.x, current.y)
53+
: new Coordinate(current.x, other.y);
54+
final Coordinate bottomCorner =
55+
current.y >= other.y
56+
? new Coordinate(other.x, current.y)
57+
: new Coordinate(current.x, other.y);
58+
59+
final boolean allPointsInside =
60+
isInsideBelow(topCorner, boundingLines) && isInsideAbove(bottomCorner, boundingLines);
61+
62+
if (!allPointsInside) {
63+
return false;
64+
}
65+
66+
return true;
67+
68+
/*
69+
for (long x = Math.min(current.x, other.x) + 1; x < Math.max(current.x, other.x); ++x) {
70+
if (!isInside(new Coordinate(x, current.y), boundingLines)
71+
|| !isInside(new Coordinate(x, other.y), boundingLines)) {
72+
return false;
73+
}
74+
}
75+
76+
for (long y = Math.min(current.y, other.y) + 1; y < Math.max(current.y, other.y); ++y) {
77+
if (!isInside(new Coordinate(current.x, y), boundingLines)
78+
|| !isInside(new Coordinate(other.x, y), boundingLines)) {
79+
return false;
80+
}
81+
}
82+
83+
return true;
84+
85+
/*final Set<Line> rectangle =
86+
Set.of(
87+
new Line(current, corner1),
88+
new Line(current, corner2),
89+
new Line(other, corner1),
90+
new Line(other, corner2));
91+
92+
for (final Line side : rectangle) {
93+
for (final Line boundingLine : boundingLines) {
94+
if (side.reallyIntersects(boundingLine)) {
95+
return false;
96+
}
97+
}
98+
}
99+
100+
return true;*/
101+
});
102+
}
103+
104+
private void run(final Scanner in, final TriPredicate validityChecker) {
105+
final List<Coordinate> tiles = new ArrayList<>();
106+
long maxArea = 0;
107+
108+
while (in.hasNextLine()) {
109+
final String[] line = in.nextLine().split(",");
110+
tiles.add(new Coordinate(Long.parseLong(line[0]), Long.parseLong(line[1])));
111+
}
112+
113+
final List<Line> lines = new ArrayList<>();
114+
for (int i = 0; i < tiles.size(); i++) {
115+
lines.add(new Line(tiles.get(i), tiles.get((i + 1) % tiles.size())));
116+
}
117+
118+
for (int i = 0; i < tiles.size(); ++i) {
119+
final Coordinate current = tiles.get(i);
120+
121+
for (int j = i + 1; j < tiles.size(); ++j) {
122+
final Coordinate other = tiles.get(j);
123+
124+
final long area = (1 + Math.abs(other.x - current.x)) * (1 + Math.abs(other.y - current.y));
125+
if (area > maxArea && validityChecker.apply(current, other, lines)) {
126+
maxArea = area;
127+
}
128+
}
129+
}
130+
131+
print(maxArea);
132+
}
133+
134+
private boolean isInsideBelow(final Coordinate point, final List<Line> boundingLines) {
135+
final Line ray = new Line(point, new Coordinate(100000, point.y));
136+
137+
return boundingLines.stream().filter(ray::intersectsRayBelow).count() % 2 == 1;
29138
}
30139

31-
private void run(final Scanner in) {
32-
// not yet implemented
140+
private boolean isInsideAbove(final Coordinate point, final List<Line> boundingLines) {
141+
final Line ray = new Line(point, new Coordinate(100000, point.y));
142+
143+
return boundingLines.stream().filter(ray::intersectsRayAbove).count() % 2 == 1;
144+
}
145+
146+
private interface TriPredicate {
147+
boolean apply(Coordinate tile1, Coordinate tile2, List<Line> lines);
148+
}
149+
150+
private record Coordinate(long x, long y) {}
151+
152+
private record Line(Coordinate start, Coordinate end) {
153+
public boolean intersectsTopLine(final Line other) {
154+
final boolean otherIsVertical = other.start.x == other.end.x;
155+
156+
if (!otherIsVertical) {
157+
return false;
158+
}
159+
160+
return Math.min(start.x, end.x) < other.start.x
161+
&& other.start.x < Math.max(start.x, end.x)
162+
&& Math.min(other.start.y, other.end.y) <= start.y
163+
&& start.y < Math.max(other.start.y, other.end.y);
164+
}
165+
166+
public boolean intersectsBottomLine(final Line other) {
167+
final boolean otherIsVertical = other.start.x == other.end.x;
168+
169+
if (!otherIsVertical) {
170+
return false;
171+
}
172+
173+
return Math.min(start.x, end.x) < other.start.x
174+
&& other.start.x < Math.max(start.x, end.x)
175+
&& Math.min(other.start.y, other.end.y) < start.y
176+
&& start.y <= Math.max(other.start.y, other.end.y);
177+
}
178+
179+
public boolean intersectsLeftLine(final Line other) {
180+
final boolean otherIsVertical = other.start.x == other.end.x;
181+
182+
if (otherIsVertical) {
183+
return false;
184+
}
185+
186+
return Math.min(start.x, end.x) <= other.start.x
187+
&& other.start.x < Math.max(start.x, end.x)
188+
&& Math.min(other.start.y, other.end.y) < start.y
189+
&& start.y < Math.max(other.start.y, other.end.y);
190+
}
191+
192+
public boolean intersectsRightLine(final Line other) {
193+
final boolean otherIsVertical = other.start.x == other.end.x;
194+
195+
if (otherIsVertical) {
196+
return false;
197+
}
198+
199+
return Math.min(start.x, end.x) < other.start.x
200+
&& other.start.x <= Math.max(start.x, end.x)
201+
&& Math.min(other.start.y, other.end.y) < start.y
202+
&& start.y < Math.max(other.start.y, other.end.y);
203+
}
204+
205+
public boolean intersectsRayBelow(final Line other) {
206+
final boolean otherIsVertical = other.start.x == other.end.x;
207+
208+
if (!otherIsVertical) {
209+
return false;
210+
}
211+
212+
return Math.min(start.x, end.x) < other.start.x
213+
&& other.start.x <= Math.max(start.x, end.x)
214+
&& Math.min(other.start.y, other.end.y) <= start.y
215+
&& start.y < Math.max(other.start.y, other.end.y);
216+
}
217+
218+
public boolean intersectsRayAbove(final Line other) {
219+
final boolean otherIsVertical = other.start.x == other.end.x;
220+
221+
if (!otherIsVertical) {
222+
return false;
223+
}
224+
225+
return Math.min(start.x, end.x) < other.start.x
226+
&& other.start.x <= Math.max(start.x, end.x)
227+
&& Math.min(other.start.y, other.end.y) < start.y
228+
&& start.y <= Math.max(other.start.y, other.end.y);
229+
}
33230
}
34231
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
4755064176
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/YGkXCIc5GVq9s5HjwStzA==@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
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
50
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
7,1
2+
11,1
3+
11,7
4+
9,7
5+
9,5
6+
2,5
7+
2,3
8+
7,3

adventofcode/src/test/resources/org/ck/adventofcode/year2025/day09/02.result.txt

Whitespace-only changes.

0 commit comments

Comments
 (0)