From bf54036643f98ed1467927afcb60186f6053ffe2 Mon Sep 17 00:00:00 2001 From: kirbylife Date: Wed, 11 Dec 2024 00:35:27 -0600 Subject: [PATCH] Day 6 part 2 --- day-6/main.js | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 8 deletions(-) diff --git a/day-6/main.js b/day-6/main.js index c1234eb..4a90dfc 100644 --- a/day-6/main.js +++ b/day-6/main.js @@ -28,23 +28,66 @@ function getInput() { return data; } -function part1() { - let data = getInput(); +function getStart(data) { const HEIGHT = data.length; - const WIDTH = data[0].length; - let currentDir = DIRECTIONS.UP; - let actualPos = { x: 0, y: 0 }; - // Search initial pos for (let y = 0; y < HEIGHT; y++) { const x = data[y].indexOf("^"); if (x == -1) continue; - data[y][x] = "X"; actualPos.y = y; 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 let counter = 1; @@ -89,4 +132,32 @@ function part1() { // 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(); + +console.log("Part 2:"); +part2();