Untitled

 avatar
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...