Skip to content

Commit 1a4fd8b

Browse files
committed
Complete part1 and begin part 2
1 parent de758c7 commit 1a4fd8b

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed

red_nosed_reports/part1.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// every sequence must follow two rules
2+
// sequence must be either all increasing or all decreasing from left to right
3+
// adjacent numbers must differ by at least 1 or at most 3.
4+
5+
// split up input line by line
6+
// loop through input
7+
// for every line, split up that input by space
8+
// if there is no sequence, find out if the difference btwn first two numbers violates the difference rule
9+
// then set the sequence
10+
// if there is a sequence find out if the two numbers violate that rule, then do the above.
11+
12+
const fs = require("fs");
13+
const input = fs.readFileSync("./input.txt", "utf8").split(/\n/);
14+
15+
function findUnsafe(reports) {
16+
let safe = 0;
17+
for (let i = 0; i < reports.length; i++) {
18+
let currSeq = 0;
19+
let isSafe = true;
20+
const levels = reports[i].split(/\s/).map((el) => Number(el));
21+
for (let j = 1; j < levels.length; j++) {
22+
if (!currSeq) {
23+
currSeq = levels[j] > levels[j - 1] ? 1 : -1;
24+
}
25+
const diff = Math.abs(levels[j - 1] - levels[j]);
26+
if (diff < 1 || diff > 3) {
27+
isSafe = false;
28+
break;
29+
}
30+
if (
31+
(currSeq === -1 && levels[j] > levels[j - 1]) ||
32+
(currSeq === 1 && levels[j] < levels[j - 1])
33+
) {
34+
isSafe = false;
35+
break;
36+
}
37+
}
38+
if (isSafe) safe += 1;
39+
}
40+
return safe;
41+
}
42+
43+
console.log(findUnsafe(input));

red_nosed_reports/part2.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
const fs = require("fs");
2+
const input = fs.readFileSync("./input.txt", "utf8").split("\n");
3+
4+
function findSafe(reports) {
5+
let safe = 0;
6+
for (let report of reports) {
7+
const levels = report.split(/\s/).map((el) => Number(el));
8+
const stack = [];
9+
let dampener = false;
10+
let isSafe = true;
11+
let inc = 0;
12+
let dec = 0;
13+
for (let i = levels.length - 1; i - 1 >= 0; i--) {
14+
if (levels[i] > levels[i - 1]) inc += 1;
15+
else if (levels[i] < levels[i - 1]) dec += 1;
16+
}
17+
if (inc === dec) {
18+
// report is unsafe. Move to the next one
19+
continue;
20+
}
21+
const seqDir = inc > dec ? "inc" : "dec";
22+
23+
stack.push(levels.pop());
24+
while (levels.length > 1) {
25+
if (
26+
!checkSafety(stack[stack.length - 1], levels[levels.length - 1], seqDir)
27+
) {
28+
if (dampener) {
29+
isSafe = false;
30+
break;
31+
} else {
32+
dampener = true;
33+
if (
34+
checkSafety(
35+
stack[stack.length - 1],
36+
levels[levels.length - 2],
37+
seqDir
38+
)
39+
) {
40+
levels.pop();
41+
} else {
42+
stack.pop();
43+
}
44+
}
45+
} else {
46+
stack.push(levels.pop());
47+
}
48+
}
49+
50+
// console.log(report, isSafe, seqDir);
51+
if (isSafe) safe += 1;
52+
}
53+
return safe;
54+
}
55+
56+
function checkSafety(prevNum, nextNum, direction) {
57+
let currDir = "";
58+
if (prevNum > nextNum) {
59+
currDir = "inc";
60+
} else if (prevNum < nextNum) {
61+
currDir = "dec";
62+
}
63+
64+
let diff = Math.abs(prevNum - nextNum);
65+
66+
if (diff < 1 || diff > 3 || currDir !== direction) {
67+
return false;
68+
}
69+
return true;
70+
}
71+
72+
console.log(findSafe(input));

0 commit comments

Comments
 (0)