-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday3.ts
103 lines (90 loc) · 2.95 KB
/
day3.ts
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
92
93
94
95
96
97
98
99
100
101
102
103
import { assertEquals } from "https://deno.land/[email protected]/assert/mod.ts";
import { loadData, loadTestData } from "./utils.ts";
const part1test = 4361;
const part2test = 467835;
interface Gear {
adjacentNums: number;
ratio: number;
}
const part1 = (data: string) => {
const lines = data.split("\n");
const numbers = [];
const regex = /\d+/g;
for (let i = 0; i < lines.length; i++) {
for (const match of lines[i].matchAll(regex)) {
numbers.push({
idx: [i, match.index!],
value: match[0],
});
}
}
let sum = 0;
for (const number of numbers) {
const len = number.value.length;
const idxs = [];
for (let i = -1; i <= len; i++) {
idxs.push([number.idx[0] - 1, number.idx[1] + i]);
idxs.push([number.idx[0], number.idx[1] + i]);
idxs.push([number.idx[0] + 1, number.idx[1] + i]);
}
for (
const idx of idxs.filter((idx) =>
idx[0] >= 0 && idx[0] < lines.length && idx[1] >= 0 &&
idx[1] < lines[0].length
)
) {
const char = lines[idx[0]][idx[1]];
if (char != "." && !("1234567890".includes(char))) {
sum += parseInt(number.value);
break;
}
}
}
return sum;
};
const part2 = (data: string) => {
const lines = data.split("\n");
const numbers = [];
const regex = /\d+/g;
for (let i = 0; i < lines.length; i++) {
for (const match of lines[i].matchAll(regex)) {
numbers.push({
idx: [i, match.index!],
value: match[0],
});
}
}
const gears: Gear[] = new Array(lines[0].length * lines.length).fill(null).map(() => { return { adjacentNums: 0, ratio: 1 } });
for (const number of numbers) {
const len = number.value.length;
const idxs = [];
for (let i = -1; i <= len; i++) {
idxs.push([number.idx[0] - 1, number.idx[1] + i]);
idxs.push([number.idx[0], number.idx[1] + i]);
idxs.push([number.idx[0] + 1, number.idx[1] + i]);
}
for (
const idx of idxs.filter((idx) =>
idx[0] >= 0 && idx[0] < lines.length && idx[1] >= 0 &&
idx[1] < lines[0].length
)
) {
const char = lines[idx[0]][idx[1]];
if (char == "*") {
gears[idx[0] * lines.length + idx[1]].adjacentNums++;
gears[idx[0] * lines.length + idx[1]].ratio *= parseInt(number.value);
}
}
}
let sum = 0;
for (const gear of gears) {
if (gear.adjacentNums == 2) {
sum += gear.ratio;
}
}
return sum;
};
assertEquals(part1(await loadTestData(3)), part1test);
console.log(part1(await loadData(3)));
assertEquals(part2(await loadTestData(3)), part2test);
console.log(part2(await loadData(3)));