-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path10.js
91 lines (87 loc) · 2.37 KB
/
10.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
{([(<{}[<>[]}>{[]{[(<()>
*/
import { getFileContent, getDataAsArray } from "./utils.js";
const matchingBrackets = new Map([
[")", "("],
["]", "["],
["}", "{"],
[">", "<"],
["(", ")"],
["[", "]"],
["{", "}"],
["<", ">"],
]);
const first = (arr) => {
const scoreTable = new Map([
[")", 3],
["]", 57],
["}", 1197],
[">", 25137],
]);
const illegalCharacters = [];
arr.forEach((line, i) => {
const lineArr = line.split("");
const stack = [];
while (lineArr.length > 0) {
const bracket = lineArr.shift();
// process.stdout.write(`${bracket} -> ${stack.join("")}\n`);
if (")]}>".includes(bracket)) {
if (stack.at(-1) !== matchingBrackets.get(bracket)) {
// console.log(
// `Expected ${matchingBrackets.get(stack.at(-1))}, got ${bracket}`
// );
illegalCharacters.push(bracket);
return;
}
// console.log("Popping stack");
stack.pop();
continue;
}
stack.push(bracket);
}
});
return illegalCharacters
.map((ch) => scoreTable.get(ch))
.reduce((a, v) => a + v, 0);
};
const second = (arr) => {
const scoreTable = new Map([
[")", 1],
["]", 2],
["}", 3],
[">", 4],
]);
let scores = [];
arr.forEach((line, i) => {
const lineArr = line.split("");
let stack = [];
while (lineArr.length > 0) {
const bracket = lineArr.shift();
// process.stdout.write(`${bracket} -> ${stack.join("")}\n`);
if (")]}>".includes(bracket)) {
if (stack.at(-1) !== matchingBrackets.get(bracket)) {
// console.log(
// `Expected ${matchingBrackets.get(stack.at(-1))}, got ${bracket}`
// );
return;
}
// console.log("Popping stack");
stack.pop();
continue;
}
stack.push(bracket);
}
if (stack.length > 0) {
stack = stack.map((ch) => matchingBrackets.get(ch)).reverse();
scores.push(stack.reduce((a, v) => a * 5 + scoreTable.get(v), 0));
}
});
scores = scores.sort((a, b) => a - b);
return scores[Math.floor(scores.length / 2)];
};
const data = getDataAsArray(getFileContent("input.txt"));
console.log(first(data));
console.log(second(data));
console.assert(first(data) === 26397, "Not matching first part");
console.assert(second(data) === 288957, "Not matching second part");