generated from eric/adventofcode2023
143 lines
3.6 KiB
JavaScript
143 lines
3.6 KiB
JavaScript
import { readFileSync } from 'node:fs';
|
|
|
|
let sampleMode = false;
|
|
let usedArray = [];
|
|
|
|
const sampleArray = readFileSync('sample.txt').toString().split("\n");
|
|
const inputArray = readFileSync('input.txt').toString().split("\n");
|
|
|
|
if (sampleMode) {
|
|
usedArray = [].concat(sampleArray);
|
|
} else {
|
|
usedArray = [].concat(inputArray);
|
|
}
|
|
|
|
// Part One
|
|
|
|
console.time("part1");
|
|
let sum = 0;
|
|
|
|
for (let i = 0; i < usedArray.length; i++) {
|
|
let row = usedArray[i];
|
|
for (let j = 0; j < row.length; j++) {
|
|
let cell = row[j];
|
|
if (cell === '@') {
|
|
let openSides = 0;
|
|
const left = j > 0 ? row[j - 1] : '.';
|
|
const right = j < row.length - 1 ? row[j + 1] : '.';
|
|
const up = i > 0 ? usedArray[i - 1][j] : '.';
|
|
const down = i < usedArray.length - 1 ? usedArray[i + 1][j] : '.';
|
|
const upperLeft = i > 0 && j > 0 ? usedArray[i - 1][j - 1] : '.';
|
|
const upperRight = i > 0 && j < row.length - 1 ? usedArray[i - 1][j + 1] : '.';
|
|
const lowerLeft = i < usedArray.length - 1 && j > 0 ? usedArray[i + 1][j - 1] : '.';
|
|
const lowerRight = i < usedArray.length - 1 && j < row.length - 1 ? usedArray[i + 1][j + 1] : '.';
|
|
if (left === '.') {
|
|
openSides++;
|
|
}
|
|
if (right === '.') {
|
|
openSides++;
|
|
}
|
|
if (up === '.') {
|
|
openSides++;
|
|
}
|
|
if (down === '.') {
|
|
openSides++;
|
|
}
|
|
if (upperLeft === '.') {
|
|
openSides++;
|
|
}
|
|
if (upperRight === '.') {
|
|
openSides++;
|
|
}
|
|
if (lowerLeft === '.') {
|
|
openSides++;
|
|
}
|
|
if (lowerRight === '.') {
|
|
openSides++;
|
|
}
|
|
if (openSides >= 5) {
|
|
sum++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
console.timeEnd("part1");
|
|
console.log(sum);
|
|
|
|
|
|
// Part Two
|
|
|
|
let usedArray2 = [];
|
|
if (sampleMode) {
|
|
usedArray2 = [].concat(sampleArray);
|
|
} else {
|
|
usedArray2 = [].concat(inputArray);
|
|
}
|
|
|
|
console.time("part2");
|
|
let sum2 = 0;
|
|
let done = false;
|
|
|
|
while (!done) {
|
|
getOpenSides(sum2, usedArray2);
|
|
}
|
|
|
|
console.timeEnd("part2");
|
|
console.log(sum2);
|
|
|
|
// functions
|
|
|
|
function getOpenSides(startingSum, usedArray) {
|
|
const newSum = JSON.parse(JSON.stringify(startingSum));
|
|
for (let i = 0; i < usedArray.length; i++) {
|
|
let row = [...usedArray[i].split('')];
|
|
for (let j = 0; j < row.length; j++) {
|
|
let cell = row[j];
|
|
if (cell === '@') {
|
|
let openSides = 0;
|
|
const left = j > 0 ? row[j - 1] : '.';
|
|
const right = j < row.length - 1 ? row[j + 1] : '.';
|
|
const up = i > 0 ? usedArray[i - 1][j] : '.';
|
|
const down = i < usedArray.length - 1 ? usedArray[i + 1][j] : '.';
|
|
const upperLeft = i > 0 && j > 0 ? usedArray[i - 1][j - 1] : '.';
|
|
const upperRight = i > 0 && j < row.length - 1 ? usedArray[i - 1][j + 1] : '.';
|
|
const lowerLeft = i < usedArray.length - 1 && j > 0 ? usedArray[i + 1][j - 1] : '.';
|
|
const lowerRight = i < usedArray.length - 1 && j < row.length - 1 ? usedArray[i + 1][j + 1] : '.';
|
|
if (left === '.') {
|
|
openSides++;
|
|
}
|
|
if (right === '.') {
|
|
openSides++;
|
|
}
|
|
if (up === '.') {
|
|
openSides++;
|
|
}
|
|
if (down === '.') {
|
|
openSides++;
|
|
}
|
|
if (upperLeft === '.') {
|
|
openSides++;
|
|
}
|
|
if (upperRight === '.') {
|
|
openSides++;
|
|
}
|
|
if (lowerLeft === '.') {
|
|
openSides++;
|
|
}
|
|
if (lowerRight === '.') {
|
|
openSides++;
|
|
}
|
|
if (openSides >= 5) {
|
|
sum2++;
|
|
row[j] = '.';
|
|
}
|
|
}
|
|
}
|
|
usedArray[i] = row.join('');
|
|
}
|
|
|
|
if (sum2 === newSum) {
|
|
done = true;
|
|
}
|
|
} |