| import { readFileSync } from "fs"; |
| |
| const input = readFileSync('day 5/input.txt').toString().split('\n\n') |
| |
| interface MappedRange { |
| start: number; |
| dest: number; |
| rangeLength: number; |
| pointers: Record<number, number>; |
| } |
| |
| interface Input { |
| seeds?: number[]; |
| sts?: MappedRange[]; |
| stf?: MappedRange[]; |
| ftw?: MappedRange[]; |
| wtl?: MappedRange[]; |
| ltt?: MappedRange[]; |
| tth?: MappedRange[]; |
| htl?: MappedRange[]; |
| } |
| |
| |
| const mappedInput: Input = {}; |
| |
| mappedInput.seeds = input[0].split(':')[1].trim().split(' ').map(i => parseInt(i)); |
| const sts = input[1].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const stf = input[2].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const ftw = input[3].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const wtl = input[4].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const ltt = input[5].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const tth = input[6].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| const htl = input[7].split(':')[1].trim().split('\n').map(i => i.split(' ').map(n => parseInt(n))); |
| |
| function pointerMap(array: number[][]) { |
| return array.map(arr => { |
| const pointers: Record<number, number> = {} |
| for(Object.keys(pointers).length; Object.keys(pointers).length < arr[2];) { |
| const start = arr[1] + Object.keys(pointers).length; |
| const dest = arr[0] + Object.keys(pointers).length |
| console.log(`Creating Pointer ${start} => ${dest}`) |
| pointers[start] = dest; |
| } |
| |
| return { |
| pointers, |
| rangeLength: arr[2], |
| start: arr[1], |
| dest: arr[0] |
| } |
| }) |
| } |
| console.log(`Generating Pointers for seed to soil`) |
| mappedInput.sts = pointerMap(sts); |
| console.log(`Generating Pointers for soil to fertilizer`) |
| mappedInput.stf = pointerMap(stf); |
| console.log(`Generating Pointers for fertilizer to water`) |
| mappedInput.ftw = pointerMap(ftw); |
| console.log(`Generating Pointers for water to light`) |
| mappedInput.wtl = pointerMap(wtl); |
| console.log(`Generating Pointers for light to temp`) |
| mappedInput.ltt = pointerMap(ltt); |
| console.log(`Generating Pointers for temp to humidity`) |
| mappedInput.tth = pointerMap(tth); |
| console.log(`Generating Pointers for humidity to location`) |
| mappedInput.htl = pointerMap(htl); |
| |
| |
| // Part 1 |
| (() => { |
| const locations: {seed: number, location: number}[] = [] |
| for(const seed of mappedInput.seeds) { |
| console.log(`Checking ${seed}`) |
| |
| const soil = mappedInput.stf.find(s => Object.keys(s.pointers).includes(seed.toString()))?.pointers[seed] ?? seed |
| console.log(soil === seed ? `Continuing with default` : `Found ${soil}`) |
| const fertilizer = mappedInput.stf.find(s => Object.keys(s.pointers).includes(soil.toString()))?.pointers[soil] ?? soil |
| console.log(fertilizer === soil ? `Continuing with default` : `Found ${fertilizer}`) |
| const water = mappedInput.stf.find(s => Object.keys(s.pointers).includes(fertilizer.toString()))?.pointers[fertilizer] ?? fertilizer |
| console.log(water === fertilizer ? `Continuing with default` : `Found ${water}`) |
| const light = mappedInput.stf.find(s => Object.keys(s.pointers).includes(water.toString()))?.pointers[water] ?? water |
| console.log(light === water ? `Continuing with default` : `Found ${light}`) |
| const temperature = mappedInput.stf.find(s => Object.keys(s.pointers).includes(light.toString()))?.pointers[light] ?? light |
| console.log(temperature === light ? `Continuing with default` : `Found ${temperature}`) |
| const humidity = mappedInput.stf.find(s => Object.keys(s.pointers).includes(temperature.toString()))?.pointers[temperature] ?? temperature |
| console.log(humidity === temperature ? `Continuing with default` : `Found ${humidity}`) |
| const location = mappedInput.stf.find(s => Object.keys(s.pointers).includes(humidity.toString()))?.pointers[humidity] ?? humidity |
| console.log(location === humidity ? `Continuing with default` : `Found ${location}`) |
| |
| locations.push({seed, location}) |
| } |
| |
| const sorted = locations.sort((a,b) => a.location < b.location ? -1 : 1); |
| console.log(sorted) |
| const smallest = sorted[0] |
| console.log(`(Part 1) Lowest location number: (seed: ${smallest.seed}) ${smallest.location}`) |
| })(); |