Day 6 part 2

main
kirbylife 2024-12-11 00:35:27 -06:00
parent e389edd2b3
commit bf54036643
1 changed files with 79 additions and 8 deletions

View File

@ -28,23 +28,66 @@ function getInput() {
return data; return data;
} }
function part1() { function getStart(data) {
let data = getInput();
const HEIGHT = data.length; const HEIGHT = data.length;
const WIDTH = data[0].length;
let currentDir = DIRECTIONS.UP;
let actualPos = { x: 0, y: 0 }; let actualPos = { x: 0, y: 0 };
// Search initial pos
for (let y = 0; y < HEIGHT; y++) { for (let y = 0; y < HEIGHT; y++) {
const x = data[y].indexOf("^"); const x = data[y].indexOf("^");
if (x == -1) continue; if (x == -1) continue;
data[y][x] = "X";
actualPos.y = y; actualPos.y = y;
actualPos.x = x; actualPos.x = x;
} }
// console.log(actualPos); return actualPos;
}
function detectLoop(obstacle) {
let data = getInput();
data[obstacle[0]][obstacle[1]] = "#";
let currentDir = DIRECTIONS.UP;
let actualPos = getStart(data);
data[actualPos.y][actualPos.x] = ".";
let counter = 1;
let nextStep = null;
let newX = null;
let newY = null;
while (true) {
switch (currentDir) {
case DIRECTIONS.UP:
newY = actualPos.y - 1;
newX = actualPos.x;
break;
case DIRECTIONS.DOWN:
newY = actualPos.y + 1;
newX = actualPos.x;
break;
case DIRECTIONS.LEFT:
newY = actualPos.y;
newX = actualPos.x - 1;
break;
case DIRECTIONS.RIGHT:
newY = actualPos.y;
newX = actualPos.x + 1;
break;
}
nextStep = (data[newY] ?? [])[newX];
if (nextStep == undefined) return false;
if (nextStep == ".") {
// data[newY][newX] = "X";
actualPos.y = newY;
actualPos.x = newX;
counter++;
if (counter >= 20000) return true;
} else {
currentDir = rotate(currentDir);
}
}
}
function part1(data = getInput()) {
let currentDir = DIRECTIONS.UP;
let actualPos = getStart(data);
data[actualPos.y][actualPos.x] = "X";
// Start algorithm // Start algorithm
let counter = 1; let counter = 1;
@ -89,4 +132,32 @@ function part1() {
// console.log(data.map((line) => line.join("")).join("\n")); // console.log(data.map((line) => line.join("")).join("\n"));
} }
function part2() {
let data = getInput();
let actualPos = getStart(data);
let possibleObstacle = [];
for (let y in data) {
for (let x in data) {
if (data[y][x] == "." || (y != actualPos.y && x != actualPos.x)) {
possibleObstacle.push([y, x]);
}
}
}
let counter = 0;
for (const obstacle of possibleObstacle) {
let innerData = getInput();
if (detectLoop(obstacle)) {
counter++;
}
}
console.log(counter);
}
console.log("Part 1:");
part1(); part1();
console.log("Part 2:");
part2();