Untitled
unknown
javascript
4 years ago
1.8 kB
8
Indexable
const fs = require('fs'); const input = fs.readFileSync('input.txt').toString(); const numbers = input.split('\n').map((numbers) => numbers.split('').map(Number)) const mins = []; const basins = []; //path in order to prune searching const findBasin = (map2d, x, y, path = new Map()) => { if (path.has(`${x}-${y}`)) { return 0; } if (x < 0 || y < 0) { return 0; } if (map2d[x][y] === 9) { return 0; } if (map2d[x][y] === undefined) { return 0; } let basinSum = 1; path.set(`${x}-${y}`, true); basinSum += findBasin(map2d, x - 1, y, path); //left basinSum += findBasin(map2d, x + 1, y, path); //right basinSum += findBasin(map2d, x, y - 1, path); //up basinSum += findBasin(map2d, x, y + 1, path); //down return basinSum; } numbers.forEach((row, idx1) => { //idx1 row row.forEach((el, idx2) => { //idx2 col let possibleMoves = []; if (idx2 > 0 && numbers[idx1][idx2 - 1] !== undefined) { //left possibleMoves.push(numbers[idx1][idx2 - 1]) } if (numbers[idx1][idx2 + 1] !== undefined) { //right possibleMoves.push(numbers[idx1][idx2 + 1]) } if (idx1 - 1 >= 0 && numbers[idx1 - 1][idx2] !== undefined) { //down possibleMoves.push(numbers[idx1 - 1][idx2]) } if (idx1 + 1 < numbers.length && numbers[idx1 + 1][idx2] !== undefined) { // up possibleMoves.push(numbers[idx1 + 1][idx2]) } if (possibleMoves.every((x) => x > numbers[idx1][idx2])) { mins.push(numbers[idx1][idx2]); basins.push(findBasin(numbers, idx1, idx2)); } }); }); //a console.log(mins.map((x) => x + 1).reduce((acc, a) => acc + a)) //b console.log(basins.sort((a, b) => a >= b ? -1 : 1).slice(0, 3).reduce((acc, v) => acc * v));
Editor is loading...