Day 6 part 2
parent
e389edd2b3
commit
bf54036643
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue