-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpart1.ts
62 lines (56 loc) · 1.87 KB
/
part1.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
import * as fs from 'fs';
const input = fs.readFileSync('input', 'utf8').split('\n');
const components: Record<string, string[]> = {};
const betweenness: Record<string, number> = {};
input.forEach((line) => {
const [component1, connected] = line.split(': ');
const component2s = connected.split(' ');
component2s.forEach((component2) => {
components[component1] ??= [];
components[component1].push(component2);
components[component2] ??= [];
components[component2].push(component1);
});
});
Object.keys(components).forEach((component) => {
const visited = new Set<string>();
const queue: [string, string[]][] = [[component, []]];
while (queue.length) {
const [current, path] = queue.shift()!;
path.forEach((connection) => {
betweenness[connection] = (betweenness[connection] || 0) + 1;
});
components[current].forEach((next) => {
if (!visited.has(next)) {
visited.add(next);
queue.push([next, [...path, [current, next].sort().join(',')]]);
}
});
}
});
const importantConnections = Object.keys(betweenness)
.sort((a, b) => betweenness[b] - betweenness[a])
.slice(0, 3)
.map((x) => x.split(','));
importantConnections.forEach((connection) => {
const [comp1, comp2] = connection;
components[comp1]?.splice(components[comp1].indexOf(comp2), 1);
if (!components[comp1]?.length) delete components[comp1];
components[comp2]?.splice(components[comp2].indexOf(comp1), 1);
if (!components[comp2]?.length) delete components[comp2];
});
const lastComponent = Object.keys(components).pop();
if (lastComponent) {
const visited = new Set<string>([lastComponent]);
const queue = [lastComponent];
while (queue.length > 0) {
const current = queue.pop()!;
for (const next of components[current] || []) {
if (!visited.has(next)) {
visited.add(next);
queue.push(next);
}
}
}
console.log(visited.size * (Object.keys(components).length - visited.size));
}