Skip to content

Commit 13251a9

Browse files
committed
Day 5 solved
1 parent d9c6d7e commit 13251a9

1 file changed

Lines changed: 75 additions & 0 deletions

File tree

  • src/main/java/com/sbaars/adventofcode/year25/days
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.sbaars.adventofcode.year25.days;
2+
3+
import com.sbaars.adventofcode.year25.Day2025;
4+
import java.util.*;
5+
import java.util.stream.Collectors;
6+
7+
public class Day5 extends Day2025 {
8+
public Day5() {
9+
super(5);
10+
}
11+
12+
public static void main(String[] args) {
13+
new Day5().printParts();
14+
}
15+
16+
record Range(long start, long end) {
17+
boolean contains(long id) {
18+
return id >= start && id <= end;
19+
}
20+
}
21+
22+
@Override
23+
public Object part1() {
24+
String[] parts = day().split("\n\n");
25+
26+
List<Range> ranges = Arrays.stream(parts[0].split("\n"))
27+
.map(line -> {
28+
String[] nums = line.split("-");
29+
return new Range(Long.parseLong(nums[0]), Long.parseLong(nums[1]));
30+
})
31+
.collect(Collectors.toList());
32+
33+
return Arrays.stream(parts[1].split("\n"))
34+
.map(Long::parseLong)
35+
.filter(id -> ranges.stream().anyMatch(range -> range.contains(id)))
36+
.count();
37+
}
38+
39+
@Override
40+
public Object part2() {
41+
String[] parts = day().split("\n\n");
42+
43+
List<Range> ranges = Arrays.stream(parts[0].split("\n"))
44+
.map(line -> {
45+
String[] nums = line.split("-");
46+
return new Range(Long.parseLong(nums[0]), Long.parseLong(nums[1]));
47+
})
48+
.collect(Collectors.toList());
49+
50+
// Merge overlapping ranges and count total IDs
51+
ranges.sort(Comparator.comparingLong(Range::start));
52+
53+
long totalFresh = 0;
54+
long currentStart = ranges.get(0).start;
55+
long currentEnd = ranges.get(0).end;
56+
57+
for (int i = 1; i < ranges.size(); i++) {
58+
Range r = ranges.get(i);
59+
if (r.start <= currentEnd + 1) {
60+
// Overlapping or adjacent, merge
61+
currentEnd = Math.max(currentEnd, r.end);
62+
} else {
63+
// Non-overlapping, count current range and start new one
64+
totalFresh += (currentEnd - currentStart + 1);
65+
currentStart = r.start;
66+
currentEnd = r.end;
67+
}
68+
}
69+
70+
// Add the last range
71+
totalFresh += (currentEnd - currentStart + 1);
72+
73+
return totalFresh;
74+
}
75+
}

0 commit comments

Comments
 (0)