diff --git a/2024/12/index.ts b/2024/12/index.ts index 6a04eaf..5e8d8e4 100644 --- a/2024/12/index.ts +++ b/2024/12/index.ts @@ -14,40 +14,52 @@ const regions: Array> = []; function getAllAdjacentPlots({ x, y }: Coord) { const letter = plots[y][x]; - plots[y][x] = '.'+letter; + plots[y][x] = '.' + letter; const plot = { x, y, edges: 0, corners: 0 }; let adj: Array = [plot]; - let firstOneWasAnEdge = false; - let lastOneWasAnEdge = false; + let adjLetters: Array = []; + [ { x, y: y - 1 }, + { x: x + 1, y: y - 1 }, { x: x + 1, y }, + { x: x + 1, y: y + 1 }, { x, y: y + 1 }, + { x: x - 1, y: y + 1 }, { x: x - 1, y }, + { x: x - 1, y: y - 1 }, ].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++; + + if (i % 2 === 0) { + if (adjLetter === letter) { + adj = [...adj, ...getAllAdjacentPlots(adjCoord)]; + } else if (adjLetter !== '.' + letter) { + plot.edges++; } - lastOneWasAnEdge = true; - } - if (i === 0) { - firstOneWasAnEdge = lastOneWasAnEdge; } + adjLetters.push(adjLetter ? adjLetter.replace('.', '') : '_'); }); - if (firstOneWasAnEdge && lastOneWasAnEdge) { - plot.corners++; + + for (let i = 1; i < 8; i += 2) { + let cornerLetter = adjLetters[i]; + let beforeLetter = adjLetters[i - 1]; + let afterLetter = adjLetters[i + 1] || adjLetters[0]; + if (cornerLetter === letter && (beforeLetter === letter || afterLetter === letter)) { + continue; + } + if ( + (beforeLetter === letter && afterLetter === letter) + || (beforeLetter !== letter && afterLetter !== letter) + ) { + plot.corners++; + } } + return adj; } @@ -63,7 +75,6 @@ for (let y = 0; y < plots.length; y++) { } } -console.log(regions); let sum = 0; regions.forEach((plots) => { @@ -77,4 +88,3 @@ regions.forEach((plots) => { }); console.log(sum); -