-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.ts
99 lines (79 loc) · 2.28 KB
/
index.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
import {
debugGrid,
INPUT_PATH,
runner,
SAMPLE_PATH,
directions,
splitLines,
getGrid,
} from '../../../lib/utils';
const path = `${__dirname}/${INPUT_PATH}`;
const solution = (input: string, size: number, bytes: number) => {
const grid = getGrid(size, size, '.');
const positions = splitLines(input).map((r) => r.split(',').map(Number));
positions.slice(0, bytes).forEach(([x, y]) => {
grid[y][x] = '#';
});
const queue: [number, number, number][] = [[0, 0, 0]];
const visited = getGrid(size, size, false);
// debugGrid(grid);
while (queue.length) {
const [x, y, pathSize] = queue.shift()!;
if (x === size - 1 && y === size - 1) {
return pathSize;
}
for (const [dx, dy] of directions) {
const nx = x + dx;
const ny = y + dy;
if (nx >= size || nx < 0 || ny < 0 || ny >= size) continue;
if (visited[ny][nx]) continue;
if (grid[ny][nx] === '#') continue;
visited[ny][nx] = true;
queue.push([nx, ny, pathSize + 1]);
}
}
};
const solution2 = (input: string, size: number, bytes: number) => {
const positions = splitLines(input).map((r) => r.split(',').map(Number));
let lastFalse: number[] = [];
for (let i = positions.length - 1; i > bytes; i--) {
const grid = getGrid(size, size, '.');
const queue: [number, number, number][] = [[0, 0, 0]];
const visited = getGrid(size, size, false);
positions.slice(0, i + 1).forEach(([x, y]) => {
grid[y][x] = '#';
});
let exit = false;
while (queue.length) {
const [x, y, pathSize] = queue.shift()!;
if (x === size - 1 && y === size - 1) {
exit = true;
break;
}
for (const [dx, dy] of directions) {
const nx = x + dx;
const ny = y + dy;
if (nx >= size || nx < 0 || ny < 0 || ny >= size) continue;
if (visited[ny][nx]) continue;
if (grid[ny][nx] === '#') continue;
visited[ny][nx] = true;
queue.push([nx, ny, pathSize + 1]);
}
}
if (!exit) {
lastFalse = positions[i];
} else {
return lastFalse;
}
}
};
runner({
path,
// example
// solution: (input) => solution2(input, 7, 12),
solution: (input) => solution(input, 71, 1024),
});
runner({
path,
solution: (input) => solution2(input, 71, 1024),
});