diff --git a/2024/12/index.ts b/2024/12/index.ts new file mode 100644 index 0000000..6a04eaf --- /dev/null +++ b/2024/12/index.ts @@ -0,0 +1,80 @@ +const fs = require('fs'); + +const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); + +interface Coord { x: number, y: number }; +interface Plot { x: number, y: number, edges: number, corners: number }; + +const plots: Array> = input.split("\n").slice(0, -1).map((row: string) => row.split('')); + +const height = plots.length; +const width = plots[0].length; + +const regions: Array> = []; + +function getAllAdjacentPlots({ x, y }: Coord) { + const letter = plots[y][x]; + plots[y][x] = '.'+letter; + + const plot = { x, y, edges: 0, corners: 0 }; + + let adj: Array = [plot]; + + let firstOneWasAnEdge = false; + let lastOneWasAnEdge = false; + [ + { x, y: y - 1 }, + { x: x + 1, y }, + { x, y: y + 1 }, + { x: x - 1, y }, + ].forEach((adjCoord, i) => { + const adjLetter = plots[adjCoord.y] + && plots[adjCoord.y][adjCoord.x] + && plots[adjCoord.y][adjCoord.x]; + if (adjLetter === letter) { + adj = [...adj, ...getAllAdjacentPlots(adjCoord)]; + lastOneWasAnEdge = false; + } else if (adjLetter !== '.'+letter) { + plot.edges++; + if (lastOneWasAnEdge) { + plot.corners++; + } + lastOneWasAnEdge = true; + } + if (i === 0) { + firstOneWasAnEdge = lastOneWasAnEdge; + } + }); + if (firstOneWasAnEdge && lastOneWasAnEdge) { + plot.corners++; + } + return adj; +} + +for (let y = 0; y < plots.length; y++) { + const row = plots[y]; + for (let x = 0; x < row.length; x++) { + const char = row[x]; + if (char.startsWith('.')) { + continue; + } + + regions.push(getAllAdjacentPlots({ x, y })); + } +} + +console.log(regions); +let sum = 0; + +regions.forEach((plots) => { + const perim = plots.reduce((carry, { edges }) => carry + edges, 0); + const vertices = plots.reduce((carry, { corners }) => carry + corners, 0); + const area = plots.length; + // Part 1 + // sum += perim * area; + // Part 2 + sum += vertices * area; +}); + +console.log(sum); +