-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday4.ts
84 lines (74 loc) · 2.04 KB
/
day4.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
import { parseInput } from "../utils/inputParser";
export const solvePart1 = (input: string): number => {
const lines = parseInput(input);
const word = "XMAS";
const firstLetter = word[0];
const xLength = lines[0].length;
const yLength = lines.length;
const chars: string[][] = [];
lines.forEach((line) => chars.push(line.split("")));
let counter = 0;
const isMatchingWord = (
startX: number,
startY: number,
deltaX: number,
deltaY: number,
): boolean => {
for (let k = 1; k < word.length; k++) {
const newX = startX + k * deltaX;
const newY = startY + k * deltaY;
if (
newX < 0 ||
newX >= yLength ||
newY < 0 ||
newY >= xLength ||
chars[newX][newY] !== word[k]
) {
return false;
}
}
return true;
};
const directions = [
[0, 1], // ➡️
[0, -1], // ⬅️
[1, 0], // ⬇️
[-1, 0], // ⬆️
[1, 1], // ↘️
[-1, 1], // ↗️
[1, -1], // ↙️
[-1, -1], // ↖️
];
for (let i = 0; i < yLength; i++) {
for (let j = 0; j < xLength; j++) {
if (chars[i][j] === firstLetter) {
for (const [deltaX, deltaY] of directions) {
if (isMatchingWord(i, j, deltaX, deltaY)) {
counter++;
}
}
}
}
}
return counter;
};
export const solvePart2 = (input: string): number => {
const lines = parseInput(input);
const word = "MAS";
const wordReversed = word.split("").reverse().join("");
const chars: string[][] = [];
lines.forEach((line) => chars.push(line.split("")));
let counter = 0;
for (let i = 1; i < chars.length - 1; i++) {
for (let j = 1; j < chars[i].length - 1; j++) {
if (chars[i][j] === word[1]) {
const word1 = chars[i - 1][j - 1] + word[1] + chars[i + 1][j + 1];
const word2 = chars[i - 1][j + 1] + word[1] + chars[i + 1][j - 1];
if ([word, wordReversed].includes(word1) && [word, wordReversed].includes(word2)) {
counter += 1;
}
}
}
}
return counter;
};