diff options
| author | eug-vs <eugene@eug-vs.xyz> | 2023-12-05 23:35:39 +0300 | 
|---|---|---|
| committer | eug-vs <eugene@eug-vs.xyz> | 2023-12-05 23:35:39 +0300 | 
| commit | 50848c9299ededef12261011eaca60037aabcb42 (patch) | |
| tree | 66fca861f6e28c783246620b923a49ee79f8cc61 /day-5 | |
| parent | 7991dc2e29c4ee94de9d07b898fbe4c3130784bc (diff) | |
| download | aoc-2023-50848c9299ededef12261011eaca60037aabcb42.tar.gz | |
feat(day-5): add part 2 solution
Diffstat (limited to 'day-5')
| -rw-r--r-- | day-5/script.ts | 29 | 
1 files changed, 27 insertions, 2 deletions
| diff --git a/day-5/script.ts b/day-5/script.ts index 2d18477..f0eb76e 100644 --- a/day-5/script.ts +++ b/day-5/script.ts @@ -3,8 +3,20 @@ import fs from "fs";  const input = fs.readFileSync("./input.txt").toString();  const [seedStr, ...mapStrings] = input.split("\n\n"); - -const seeds = seedStr.match(/\d+/g)?.map(Number) || []; +export function chunks<T>(data: Array<T>, chunkSize: number) { +  return data.reduce((acc, value, index) => { +    // Initialize a new chunk +    if (index % chunkSize === 0) acc.push([]); +    acc[acc.length - 1].push(value); +    return acc; +  }, [] as T[][]); +} + +const seedRanges = chunks(seedStr.match(/\d+/g)?.map(Number) || [], 2).map( +  ([start, size]) => { +    return { start, size }; +  }, +);  const maps = mapStrings.map((mapString) =>    mapString @@ -19,6 +31,19 @@ const maps = mapStrings.map((mapString) =>      })),  ); +// We dont need to inspect whole seed ranges, instead we only select "interesting points" +// Interesting points lie at starts/end of ranges defined in our maps +const seeds = maps +  .flatMap((ranges) => +    ranges.flatMap((r) => [r.sourceStart, r.destinationStart + 1]), +  ) +  .filter((breakpoint) => +    seedRanges.find( +      (range) => +        breakpoint >= range.start && breakpoint < range.start + range.size, +    ), +  ); +  const locationNumbers = seeds.map((seed) =>    maps.reduce((currentNumber, mapRules) => {      const validRule = mapRules.find( | 
