37 lines
843 B
TypeScript
37 lines
843 B
TypeScript
import type { Coordinate } from '../../utils/coordinates.ts';
|
|
|
|
function parseRanges(input: string) {
|
|
return Array.from(
|
|
input.matchAll(/(\d*)-(\d*)/gm),
|
|
(m) => [Number(m[1]), Number(m[2])] as Coordinate
|
|
);
|
|
}
|
|
|
|
export function solveFirst(input: string): number {
|
|
const [r, i] = input.split('\n\n');
|
|
|
|
const ranges = parseRanges(r);
|
|
|
|
const ingredients = i.split('\n').map(Number);
|
|
|
|
return ingredients.filter((i) =>
|
|
ranges.some(([from, to]) => i >= from && i <= to)
|
|
).length;
|
|
}
|
|
|
|
export function solveSecond(input: string): number {
|
|
const ranges = parseRanges(input).toSorted((a, b) => a[0] - b[0]);
|
|
|
|
let total = 0;
|
|
|
|
ranges.reduce((lastEnd, curr) => {
|
|
if (curr[1] <= lastEnd) {
|
|
return lastEnd;
|
|
}
|
|
total += curr[1] - Math.max(lastEnd + 1, curr[0]) + 1;
|
|
return curr[1];
|
|
}, 0);
|
|
|
|
return total;
|
|
}
|