Untitled
unknown
javascript
4 years ago
1.8 kB
11
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...