summaryrefslogtreecommitdiff
path: root/aoc_2023/day-05/part_2.ts
diff options
context:
space:
mode:
Diffstat (limited to 'aoc_2023/day-05/part_2.ts')
-rw-r--r--aoc_2023/day-05/part_2.ts53
1 files changed, 38 insertions, 15 deletions
diff --git a/aoc_2023/day-05/part_2.ts b/aoc_2023/day-05/part_2.ts
index db69735..4d833c0 100644
--- a/aoc_2023/day-05/part_2.ts
+++ b/aoc_2023/day-05/part_2.ts
@@ -1,5 +1,7 @@
import { JSONHashMap } from "@/utils";
+export const infinity = Math.pow(2, 42);
+
export type Pair = [number, number];
const getIntervals = (lines: string[]) => {
@@ -51,7 +53,7 @@ const constructPiecewiseFn = (intervals: number[][]) => {
const [start, _end] = fromIntervals[0];
fn.set([0, start - 1], [0, start - 1]);
}
- const final: Pair = [fromIntervals.at(-1)![1] + 1, Infinity];
+ const final: Pair = [fromIntervals.at(-1)![1] + 1, infinity];
fn.set(final, final);
return fn
@@ -76,7 +78,10 @@ export const compose = (f: [Pair, Pair][], g: [Pair, Pair][]) => {
composed.push([
[start, end],
- [start + fOffset + gOffset, end + fOffset + gOffset],
+ [
+ start + fOffset + gOffset,
+ Math.min(end + fOffset + gOffset, infinity),
+ ],
]);
}
}
@@ -92,20 +97,38 @@ export const main = async (lines: string[]): Promise<number | string> => {
.filter((x) => x)
.map((x) => parseInt(x));
+ const seedIntervals: Pair[] = [];
+ for (let i = 0; i < seeds.length; i += 2) {
+ const [seed, offset] = [seeds[i], seeds[i + 1]];
+ seedIntervals.push([seed, seed + offset]);
+ }
+
const intervals = getIntervals(lines);
- intervals.forEach((interval, i) => {
- console.log(" ==== ");
- // console.log(interval);
- console.log(constructPiecewiseFn(interval));
- const [a, b] = [
- constructPiecewiseFn(interval),
- constructPiecewiseFn(intervals[i + 1]),
- ];
- if (i === intervals.length - 1) return;
- console.log(compose(a, b));
- });
-
- return 0;
+
+ const finalComposition: [Pair, Pair][] = intervals
+ .slice(1)
+ .reduce(
+ (acc, x) => compose(acc, constructPiecewiseFn(x)),
+ constructPiecewiseFn(intervals[0])
+ );
+
+ let min = infinity;
+ for (const [start, end] of seedIntervals) {
+ for (const [domain, range] of finalComposition) {
+ if (start <= domain[1] && domain[0] <= end) {
+ const begin = Math.max(domain[0], start);
+ const last = Math.min(domain[1], end);
+
+ const seedRangeMin = Math.min(
+ range[0] + (begin - domain[0]),
+ range[0] + (last - domain[0])
+ );
+ min = Math.min(min, seedRangeMin);
+ }
+ }
+ }
+
+ return min;
};
//