Advent Of Code 2020 solutions #JavaScript
const data = require("fs").readFileSync("input.txt", { encoding: "utf-8" }).trim();
const groups = data.split(/\n{2,}/);

const tiles = {}
const edgeCandidates = {}

for (const tileLines of groups) {
  const lines = tileLines.split(/\n/)
  const head = lines.shift();

  const id = /Tile (\d+):/.exec(head)[1];
  tiles[id] = { lines }

  tiles[id].possibleEdges = [];
  tiles[id].possibleEdges[0] = lines[0]
  tiles[id].possibleEdges[1] = lines.map(l => l[0]).join('')
  tiles[id].possibleEdges[2] = lines.map(l => l[l.length-1]).join('')
  tiles[id].possibleEdges[3] = lines[lines.length-1];
  for (let i = 0; i < 4; i++) {
    tiles[id].possibleEdges.push([...tiles[id].possibleEdges[i]].reverse().join(''))
  }

  for (const edge of tiles[id].possibleEdges) {
    edgeCandidates[edge] = edgeCandidates[edge] || [];
    edgeCandidates[edge].push(id)
  }
}

for (const tileGroup of Object.values(edgeCandidates)) {
  if (tileGroup.length ===1) {
    continue;
  }
  for (const id of tileGroup) {
    tiles[id].connections = tiles[id].connections || 0
    tiles[id].connections ++;
  }
}

let result = 1;

for (const [id, {connections}] of Object.entries(tiles)) {
  if (connections === 4) {
    result *= id
  }
}

console.log(result);