Skip to content

Commit cd9f63f

Browse files
committed
AOC 2025 day 5 improvements
1 parent bae45fe commit cd9f63f

File tree

1 file changed

+18
-30
lines changed
  • adventofcode/src/main/java/org/ck/adventofcode/year2025

1 file changed

+18
-30
lines changed

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

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ protected void runPartTwo(final Scanner in) {
2727
run(in, Day05::getAllFreshIngredientsCount);
2828
}
2929

30-
private void run(final Scanner in, final ToLongFunction<Set<Range>> getPartIngredientCount) {
31-
final Set<Range> ranges = new HashSet<>();
30+
private void run(final Scanner in, final ToLongFunction<List<Range>> getPartIngredientCount) {
31+
final List<Range> ranges = new ArrayList<>();
3232

3333
while (in.hasNextLine()) {
3434
final String line = in.nextLine();
@@ -44,7 +44,7 @@ private void run(final Scanner in, final ToLongFunction<Set<Range>> getPartIngre
4444
print(getPartIngredientCount.applyAsLong(ranges));
4545
}
4646

47-
private static ToLongFunction<Set<Range>> getAvailableFreshIngredientsCount(final Scanner in) {
47+
private static ToLongFunction<List<Range>> getAvailableFreshIngredientsCount(final Scanner in) {
4848
return ranges -> {
4949
long fresh = 0;
5050
while (in.hasNextLine()) {
@@ -62,37 +62,25 @@ private static ToLongFunction<Set<Range>> getAvailableFreshIngredientsCount(fina
6262
};
6363
}
6464

65-
private static long getAllFreshIngredientsCount(final Set<Range> ranges) {
66-
Set<Range> fresh = ranges;
67-
boolean merged = true;
68-
while (merged) {
69-
Set<Range> newFresh = new HashSet<>(fresh);
70-
merged = false;
71-
72-
for (Range first : fresh) {
73-
for (Range second : fresh) {
74-
if (first != second && first.end >= second.start && first.end <= second.end) {
75-
merged = true;
76-
newFresh.remove(first);
77-
newFresh.remove(second);
78-
newFresh.add(new Range(Math.min(first.start, second.start), second.end));
79-
break;
80-
}
81-
}
65+
private static long getAllFreshIngredientsCount(final List<Range> ranges) {
66+
ranges.sort(Comparator.comparing(Range::start));
8267

83-
if (merged) {
84-
break;
85-
}
86-
}
68+
final List<Range> merged = new ArrayList<>();
69+
Range current = ranges.get(0);
8770

88-
fresh = newFresh;
89-
}
71+
for (int i = 1; i < ranges.size(); ++i) {
72+
final Range next = ranges.get(i);
9073

91-
long freshCount = 0;
92-
for (Range range : fresh) {
93-
freshCount += range.end - range.start + 1;
74+
if (next.start <= current.end + 1) {
75+
current = new Range(current.start, Math.max(current.end, next.end));
76+
} else {
77+
merged.add(current);
78+
current = next;
79+
}
9480
}
95-
return freshCount;
81+
merged.add(current);
82+
83+
return merged.stream().mapToLong(range -> range.end - range.start + 1).sum();
9684
}
9785

9886
private record Range(long start, long end) {}

0 commit comments

Comments
 (0)