Skip to content

Commit 35e8a30

Browse files
committed
refactor(2025/day/2): RangeSet is overkill
For part 1, checking against the raw overlapping ranges is nearly just as fast and uses less memory. For part 2, other RangeSet operations are not needed, only the initial merging which can be done more efficiently inline without using the data structure.
1 parent 1a6fe1e commit 35e8a30

3 files changed

Lines changed: 20 additions & 16 deletions

File tree

2025/day/5/ingredients.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import Range from "@lib/Range.ts";
2-
3-
export function parseIngredientsDatabase(text: string) {
1+
export function parseDatabase(text: string) {
42
const [top, bottom] = text.split("\n\n");
53
const freshIdRanges = top.split("\n").map((text: string) => {
64
const [start, end] = text.split("-").map(Number);
7-
return new Range(start, end + 1);
5+
return { start, end };
86
});
97
const availableIds = bottom.split("\n").map(Number);
108
return { freshIdRanges, availableIds };

2025/day/5/part/1/solve.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import RangeSet from "@lib/RangeSet.ts";
2-
import { parseIngredientsDatabase } from "../../ingredients.ts";
1+
import { parseDatabase } from "../../ingredients.ts";
32

43
export default function solve(input: string) {
5-
const { freshIdRanges, availableIds } = parseIngredientsDatabase(input);
6-
const rangeSet = new RangeSet(freshIdRanges);
7-
let freshCount = 0;
8-
for (const availableId of availableIds) {
9-
if (rangeSet.has(availableId)) freshCount++;
10-
}
4+
const { freshIdRanges, availableIds } = parseDatabase(input);
5+
const { length: freshCount } = availableIds.filter((id) =>
6+
freshIdRanges.some(({ start, end }) => id >= start && id <= end)
7+
);
118
return freshCount;
129
}

2025/day/5/part/2/solve.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
import RangeSet from "@lib/RangeSet.ts";
2-
import { parseIngredientsDatabase } from "../../ingredients.ts";
1+
import { parseDatabase } from "../../ingredients.ts";
32

43
export default function solve(input: string) {
5-
const { freshIdRanges } = parseIngredientsDatabase(input);
6-
return new RangeSet(freshIdRanges).size;
4+
const { freshIdRanges } = parseDatabase(input);
5+
freshIdRanges.sort((a, b) => a.start - b.start);
6+
const merged: typeof freshIdRanges = [];
7+
for (const { start, end } of freshIdRanges) {
8+
const prevRange = merged.at(-1);
9+
if (prevRange && start <= prevRange.end + 1) {
10+
prevRange.end = Math.max(prevRange.end, end);
11+
} else {
12+
merged.push({ start, end });
13+
}
14+
}
15+
return merged.reduce((sum, { start, end }) => sum + (end - start + 1), 0);
716
}

0 commit comments

Comments
 (0)