From 42d1e6058657395e730e0b27e1111b28aea20bb9 Mon Sep 17 00:00:00 2001 From: Kyd Date: Mon, 12 Dec 2022 11:57:23 +0000 Subject: [PATCH] day 12 --- 2022/12.input | 41 +++++++++++++++++++++++++++++ 2022/12.js | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 2022/12.input create mode 100644 2022/12.js diff --git a/2022/12.input b/2022/12.input new file mode 100644 index 0000000..04998d3 --- /dev/null +++ b/2022/12.input @@ -0,0 +1,41 @@ +abccccccccaaaaaaaccaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccaaaaaa +abccccccccaaaaaaaccaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccaaaaaa +abccccccccccaaaaaaccaaaaaaaaaaaaaaaaccccccccccccccccacccccccccccccccccccaaaaa +abcccccaaaacaaaaaaccaaaaaaaaaaaaaaaaacccccccccccccccaaaccccaccccccccccccccaaa +abccccaaaaacaaccccccaaaaaacaaacaacaaaaaaacccccccccccaaaacccaacccccccccccccaaa +abaaccaaaaaaccccaaacaaaacacaaacaaccaaaaaacccccccccccaklaccccccccccccccccccaac +abaaccaaaaaaccaaaaaacccccccaaacccaaaaaaaccccccccccckkkllllccccccccccccccccccc +abaaccaaaaaaccaaaaaacccccccaaaaacaaaaaaacccccccccckkkklllllcccccccaaaccaccccc +abacccccaacccccaaaaacccccccaaaaaccaaaaaaacccccccckkkkpppllllccccccaaaaaaccccc +abacccccccccccaaaaacccccccccaaaacccaaaaaaccccccckkkkpppppplllccccddddaaaccccc +abccccccccccccaaaaaccccccccccaaaccaaaccccccccccckkkppppppppllllldddddddaccccc +abccacccccccccccccccccccccccccccccaaccccccccccckkkopppupppplllmmmmdddddaacccc +abccaaacaaaccccccccccccccccccccaaaaaaaaccccccckkkkopuuuuupppllmmmmmmddddacccc +abccaaaaaaaccccccccccccccccccccaaaaaaaacccccjjkkkooouuuuuuppqqqqqmmmmddddcccc +abccaaaaaacccccccccccccccaaccccccaaaacccccjjjjjjoooouuxuuuppqqqqqqmmmmdddcccc +abcaaaaaaaacccccccccccccaaacccccaaaaaccccjjjjoooooouuuxxuuvvvvvqqqqmmmdddcccc +abaaaaaaaaaacccccccaaaaaaacaacccaacaaacccjjjooooouuuuxxxxvvvvvvvqqqmmmdddcccc +abaaaaaaaaaacccaaacaaaaaaaaaacccacccaaccjjjooootttuuuxxxyyvyyvvvqqqmmmeeecccc +abcccaaacaaacccaaaaaaacaaaaaccccccccccccjjjooottttxxxxxxyyyyyyvvqqqmmmeeccccc +abcccaaacccccccaaaaaacaaaaaccccaaccaacccjjjnnntttxxxxxxxyyyyyvvvqqqnneeeccccc +SbccccaacccccccaaaaaaaaacaaacccaaaaaacccjjjnnntttxxxEzzzzyyyyvvqqqnnneeeccccc +abcccccccccccccaaaaaaaaacaaccccaaaaaccccjjjnnnttttxxxxyyyyyvvvrrrnnneeecccccc +abcccaacccccccaaaaaaaaaccccccccaaaaaacccciiinnnttttxxxyyyyywvvrrrnnneeecccccc +abcccaaaaaaccaaaaaaaacccccccccaaaaaaaaccciiiinnnttttxyyywyyywvrrrnnneeecccccc +abcccaaaaaaccaaaaaaaacccccccccaaaaaaaacccciiinnnntttxwywwyyywwwrrnnneeecccccc +abcaaaaaaaccaaaaaaaaaccccccccccccaacccccccciiinnnttwwwwwwwwwwwwrrnnneeecccccc +abcaaaaaaaccaaaaaacccccccccccccccaaccccccaaiiiinnttwwwwwwwwwwwrrrnnnffecccccc +abcccaaaaaaccaaaaaccccccccccccccccccccaaaaaciiinnssswwwssssrwwrrrnnnfffcccccc +abaacaaccaaccaaaccccccccaacccccccccccccaaaaaiiinnssssssssssrrrrrronnfffcccccc +abaccaaccaacccccccccaaacaacccccccccccccaaaaaiiimmmssssssmoosrrrrooonffaaacccc +abaaaccccaaaaaaccccccaaaaaccccccccccccaaaaaccihmmmmsssmmmoooooooooofffaaacccc +abaaaccccaaaaaacccccccaaaaaacccccccccccccaacchhhmmmmmmmmmoooooooooffffaaccccc +abaacccaaaaaaaccccccaaaaaaaaccccaaccccccccccchhhhmmmmmmmgggggooofffffaaaccccc +abaacccaaaaaaaccccccaaaaaaaccccaaaaccccccccccchhhhmmmmhggggggggfffffaaaaccccc +abccccccaaaaaaacccccaacaaaaacccaaaaccccccccccchhhhhhhhggggggggggfffaacaaccccc +abccaacccaaaaaaccccccccaaaaaccaaaaacccccccccccchhhhhhhggaaaaaaccccccccccccccc +abccaaaccaaccccccccccccccaaaaaaaaaccccccccccccccchhhhaaaccaaaacccccccccccccaa +abaaaaaaaccccccccccccccccaaaaaaaaccccccccccccccccccccaaaccccaaccccccccccccaaa +abaaaaaaaccccccccaaaccccacaaaaaacccccccccccccccccccccaaaccccccccccccccccccaaa +abaaaaaacccccccaaaaacaaaaaaaaaaacccccccccccccccccccccaaccccccccccccccccaaaaaa +abaaaaaacccccccaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccaaaaaa \ No newline at end of file diff --git a/2022/12.js b/2022/12.js new file mode 100644 index 0000000..bf15068 --- /dev/null +++ b/2022/12.js @@ -0,0 +1,71 @@ +const fs = require('fs'); +const map = fs.readFileSync('12.input').toString().split('\n').map(s => s.split('')); + +const [rows, cols] = [map.length, map[0].length - 1]; +const traverseDirections = [[-1, 0], [1, 0], [0, -1], [0, 1]]; + +const isInMap = ([row, col]) => row >= 0 && row < rows && col >= 0 && col < cols ; +const bfsCost = currElevation => ([row, col]) => map[row][col].charCodeAt(0) - currElevation.charCodeAt(0) <= 1; + +const BreadthFirst = (start, end) => { + const viewQueue = [[start, 0]]; + const visited = new Set([JSON.stringify(start)]); + let result = Infinity; + + while (viewQueue.length != 0) { + const [pos, views] = viewQueue.shift(); + + if (JSON.stringify(pos) == JSON.stringify(end)) { + result = views; + break; + } + + // Map, so make new array for each up & right direction + traverseDirections.map(([up, right]) => [pos[0] + up, pos[1] + right]) + // Can we actually move there? + .filter(isInMap) + // Can we climb there? + .filter(bfsCost(map[pos[0]][pos[1]])) + // Have we seen this before? + .filter(pos => !visited.has(JSON.stringify(pos))) + // OK, add next in direction to view queue + .forEach(pos => { + visited.add(JSON.stringify(pos)); + viewQueue.push([pos, views + 1]); + }); + } + + return result; +} + +const partOne = () => { + let start, end; + for (let row = 0; row < rows; row++) + for (let col = 0; col < cols; col++) { + if (map[row][col] == 'S') { start = [row, col]; map[row][col] = "a"; } + if (map[row][col] == 'E') { end = [row, col]; map[row][col] = "z"; } + } + + const ret = BreadthFirst(start, end); + map[end[0]][end[1]] = 'E'; + return ret; +} + +const partTwo = () => { + const starting = []; + let end; + for (let row = 0; row < rows; row++) + for (let col = 0; col < cols; col++) { + if (map[row][col] == 'a') { starting.push([row, col]) } + if (map[row][col] == 'E') { end = [row, col]; map[row][col] = "z"; } + } + + const candidates = []; + for (const start of starting) + candidates.push(BreadthFirst(start, end)); + + return candidates.sort((a, b) => a - b)[0]; +} + +console.log(`Part 1: ${partOne()}`); +console.log(`Part 2: ${partTwo()}`);