Skip to content

Commit 03ffb41

Browse files
committed
feat: cover sample 4
1 parent 42ff1ed commit 03ffb41

File tree

1 file changed

+123
-2
lines changed

1 file changed

+123
-2
lines changed

src/main/java/com/adventofcode/flashk/day12/GardenGroups.java

Lines changed: 123 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,18 @@ private int calculateRegionSides(Set<GardenPlot> gardenPlots) {
7979
// - En el resto de casos, no hay ángulos.
8080

8181
int angles = 0;
82+
int externalAngles = 0;
83+
int internalAngles = 0;
84+
int internalConvexAngles = 0;
8285

8386
for(GardenPlot gardenPlot : gardenPlots) {
84-
angles += sumExternalAngles(gardenPlot);
85-
angles += sumInternalAngles(gardenPlot); // TODO descomenta esto para resultado final
87+
externalAngles += sumExternalAngles(gardenPlot);
88+
internalAngles += sumInternalAngles(gardenPlot); // TODO descomenta esto para resultado final
89+
internalConvexAngles += sumInternalConvexAngles(gardenPlot);
8690
}
8791

92+
angles = externalAngles + internalAngles + internalConvexAngles;
93+
8894
// https://www.sciencing.com/how-to-find-the-number-of-sides-of-a-polygon-12751688/
8995
return (angles / 180) + 2;
9096
}
@@ -220,6 +226,121 @@ private boolean hasDownRightInternalAngle(GardenPlot gardenPlot) {
220226
map[downPos.getY()][downPos.getX()].getRegionId() == gardenPlot.getRegionId());
221227
}
222228

229+
private int sumInternalConvexAngles(GardenPlot gardenPlot) {
230+
int angles = 0;
231+
232+
if(hasUpLeftInternalConvexAngle(gardenPlot)) {
233+
angles -= 90;
234+
}
235+
236+
if(hasUpRightInternalConvexAngle(gardenPlot)) {
237+
angles -= 90;
238+
}
239+
240+
if(hasDownLeftInternalConvexAngle(gardenPlot)) {
241+
angles -= 90;
242+
}
243+
244+
if(hasDownRightInternalConvexAngle(gardenPlot)) {
245+
angles -= 90;
246+
}
247+
248+
return angles;
249+
250+
}
251+
252+
private boolean hasUpLeftInternalConvexAngle(GardenPlot gardenPlot) {
253+
254+
// Solo puede haber ángulos convexos en el interior del mapa
255+
if(isInBorder(gardenPlot.getPosition())) {
256+
return false;
257+
}
258+
259+
// Get adjacent up and left
260+
Vector2 upPos = Vector2.transform(gardenPlot.getPosition(), Vector2.down());
261+
if(map[upPos.getY()][upPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
262+
return false;
263+
}
264+
265+
Vector2 leftPos = Vector2.transform(gardenPlot.getPosition(), Vector2.left());
266+
if(map[leftPos.getY()][leftPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
267+
return false;
268+
}
269+
270+
Vector2 diagonalPos = Vector2.transform(gardenPlot.getPosition(), Vector2.downLeft());
271+
return map[diagonalPos.getY()][diagonalPos.getX()].getRegionId() == gardenPlot.getRegionId();
272+
}
273+
274+
private boolean hasUpRightInternalConvexAngle(GardenPlot gardenPlot) {
275+
276+
// Solo puede haber ángulos convexos en el interior del mapa
277+
if(isInBorder(gardenPlot.getPosition())) {
278+
return false;
279+
}
280+
281+
// Get adjacent up and left
282+
Vector2 upPos = Vector2.transform(gardenPlot.getPosition(), Vector2.down());
283+
if(map[upPos.getY()][upPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
284+
return false;
285+
}
286+
287+
Vector2 rightPos = Vector2.transform(gardenPlot.getPosition(), Vector2.right());
288+
if(map[rightPos.getY()][rightPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
289+
return false;
290+
}
291+
292+
Vector2 diagonalPos = Vector2.transform(gardenPlot.getPosition(), Vector2.downRight());
293+
return map[diagonalPos.getY()][diagonalPos.getX()].getRegionId() == gardenPlot.getRegionId();
294+
}
295+
296+
private boolean hasDownLeftInternalConvexAngle(GardenPlot gardenPlot) {
297+
298+
// Solo puede haber ángulos convexos en el interior del mapa
299+
if(isInBorder(gardenPlot.getPosition())) {
300+
return false;
301+
}
302+
303+
// Get adjacent up and left
304+
Vector2 downPos = Vector2.transform(gardenPlot.getPosition(), Vector2.up());
305+
if(map[downPos.getY()][downPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
306+
return false;
307+
}
308+
309+
Vector2 leftPos = Vector2.transform(gardenPlot.getPosition(), Vector2.left());
310+
if(map[leftPos.getY()][leftPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
311+
return false;
312+
}
313+
314+
Vector2 diagonalPos = Vector2.transform(gardenPlot.getPosition(), Vector2.upLeft());
315+
return map[diagonalPos.getY()][diagonalPos.getX()].getRegionId() == gardenPlot.getRegionId();
316+
}
317+
318+
private boolean hasDownRightInternalConvexAngle(GardenPlot gardenPlot) {
319+
320+
// Solo puede haber ángulos convexos en el interior del mapa
321+
if(isInBorder(gardenPlot.getPosition())) {
322+
return false;
323+
}
324+
325+
// Get adjacent up and left
326+
Vector2 downPos = Vector2.transform(gardenPlot.getPosition(), Vector2.up());
327+
if(map[downPos.getY()][downPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
328+
return false;
329+
}
330+
331+
Vector2 rightPos = Vector2.transform(gardenPlot.getPosition(), Vector2.right());
332+
if(map[rightPos.getY()][rightPos.getX()].getRegionId() == gardenPlot.getRegionId()) {
333+
return false;
334+
}
335+
336+
Vector2 diagonalPos = Vector2.transform(gardenPlot.getPosition(), Vector2.upRight());
337+
return map[diagonalPos.getY()][diagonalPos.getX()].getRegionId() == gardenPlot.getRegionId();
338+
}
339+
340+
private boolean isInBorder(Vector2 pos) {
341+
return (pos.getY() == 0 || pos.getY() == rows - 1 || pos.getX() == 0 || pos.getX() == cols - 1);
342+
}
343+
223344
private int sumExternalAngles(GardenPlot gardenPlot) {
224345

225346
int angles = 0;

0 commit comments

Comments
 (0)