Skip to content

Commit

Permalink
2023.03
Browse files Browse the repository at this point in the history
  • Loading branch information
kzlsakal committed Dec 3, 2023
1 parent aa04e7e commit 07e92d5
Show file tree
Hide file tree
Showing 2 changed files with 227 additions and 0 deletions.
87 changes: 87 additions & 0 deletions challenges/2023/03.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// Part 1
const solvePuzzle1 = (input) => {
const map = input.split('\n').map((line) => line.split(''));
const alreadyCounted = [];
const numbers = [];

for (let y = 0; y < map.length; y++) {
for (let x = 0; x < map[0].length; x++) {
if (
!alreadyCounted.includes(`${y},${x}`) &&
getSurroundingCoordinates(y, x).some(([y, x]) => map[y]?.[x] && !/[\d.]/.test(map[y]?.[x]))
) {
scanAndAdd(y, x, map, alreadyCounted, numbers);
}
}
}

return numbers.reduce((acc, num) => acc + Number(num), 0);
};

// Part 2
const solvePuzzle2 = (input) => {
const map = input.split('\n').map((line) => line.split(''));
let sum = 0;

for (let y = 0; y < map.length; y++) {
for (let x = 0; x < map[0].length; x++) {
if (map[y][x] === '*') {
const alreadyCounted = [];
const numbers = [];

getSurroundingCoordinates(y, x).forEach(([y, x]) => {
scanAndAdd(y, x, map, alreadyCounted, numbers);
});

if (numbers.length === 2) {
sum += numbers[0] * numbers[1];
}
}
}
}
return sum;
};

const getSurroundingCoordinates = (y, x) => [
[y - 1, x],
[y - 1, x + 1],
[y, x + 1],
[y + 1, x + 1],
[y + 1, x],
[y + 1, x - 1],
[y, x - 1],
[y - 1, x - 1],
];

const scanAndAdd = (y, x, map, alreadyCounted, numbers) => {
if (!alreadyCounted.includes(`${y},${x}`) && /\d/.test(map[y]?.[x])) {
alreadyCounted.push(`${y},${x}`);

let currentNumber = map[y][x];

let xToLeft = x - 1;
let isNumberOnLeft = /[\d]/.test(map[y][xToLeft]);

while (isNumberOnLeft) {
alreadyCounted.push(`${y},${xToLeft}`);
currentNumber = map[y][xToLeft].concat(currentNumber);
xToLeft -= 1;
isNumberOnLeft = /[\d]/.test(map[y][xToLeft]);
}

let xToRight = x + 1;
let isNumberOnRight = /[\d]/.test(map[y][xToRight]);

while (isNumberOnRight) {
alreadyCounted.push(`${y},${xToRight}`);
currentNumber = currentNumber.concat(map[y][xToRight]);
xToRight += 1;
isNumberOnRight = /[\d]/.test(map[y][xToRight]);
}

numbers.push(Number(currentNumber));
}
};

require(__dirname + '/../../utils/test.js').test(__filename, __dirname, solvePuzzle1, '1');
require(__dirname + '/../../utils/test.js').test(__filename, __dirname, solvePuzzle2, '2');
Loading

0 comments on commit 07e92d5

Please sign in to comment.