Skip to content

Commit d232933

Browse files
committed
2024D23: part 1
1 parent 937897d commit d232933

File tree

3 files changed

+103
-0
lines changed

3 files changed

+103
-0
lines changed

2024/src/2024/day23/day23.test.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {part1, part2} from "./day23";
2+
3+
describe('2024 Day 23', () => {
4+
test('Part 1', async () => {
5+
expect(await part1('testInput1')).toEqual(7);
6+
expect(await part1('input')).toEqual(1238);
7+
});
8+
9+
test('Part 2', async () => {
10+
expect(await part2('testInput1')).toEqual(31);
11+
expect(await part2('input')).toEqual(29379307);
12+
});
13+
});

2024/src/2024/day23/day23.ts

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import path from "node:path";
2+
import {readInputLineByLine} from "@utils/io";
3+
4+
export async function part1(inputFile: string) {
5+
return await day23(inputFile, findComputerTriplets);
6+
}
7+
8+
export async function part2(inputFile: string) {
9+
return await day23(inputFile);
10+
}
11+
12+
async function day23(inputFile: string, calcFn?: (lines: string[]) => number) {
13+
const inputPath = path.join(__dirname, inputFile);
14+
const lines = await readInputLineByLine(inputPath);
15+
16+
return calcFn?.(lines);
17+
}
18+
19+
function findComputerTriplets(lines: string[]) {
20+
const adjacencyList: { [key: string]: Set<string>} = {};
21+
for (const connection of lines) {
22+
const [a, b] = connection.split("-");
23+
if (!adjacencyList[a])
24+
adjacencyList[a] = new Set();
25+
if (!adjacencyList[b])
26+
adjacencyList[b] = new Set();
27+
28+
adjacencyList[a].add(b);
29+
adjacencyList[b].add(a);
30+
}
31+
32+
const triangles: Set<string> = new Set();
33+
let trianglesStartingWithT = 0;
34+
for (const [node, neighbors] of Object.entries(adjacencyList)) {
35+
const neighborsArray = Array.from(neighbors);
36+
37+
for (let i = 0; i < neighborsArray.length; i++) {
38+
for (let j = i + 1; j < neighborsArray.length; j++) {
39+
const neighborA = neighborsArray[i];
40+
const neighborB = neighborsArray[j];
41+
42+
if (adjacencyList[neighborA].has(neighborB)) {
43+
const triangle = [node, neighborA, neighborB].sort().join(",");
44+
triangles.add(triangle);
45+
}
46+
}
47+
}
48+
}
49+
50+
[...triangles].forEach((triangle: string) => {
51+
const split = triangle.split(",")
52+
if (split.some(s => s.startsWith("t"))) {
53+
trianglesStartingWithT++;
54+
}
55+
})
56+
57+
return trianglesStartingWithT;
58+
}

2024/src/2024/day23/testInput1

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
kh-tc
2+
qp-kh
3+
de-cg
4+
ka-co
5+
yn-aq
6+
qp-ub
7+
cg-tb
8+
vc-aq
9+
tb-ka
10+
wh-tc
11+
yn-cg
12+
kh-ub
13+
ta-co
14+
de-co
15+
tc-td
16+
tb-wq
17+
wh-td
18+
ta-ka
19+
td-qp
20+
aq-cg
21+
wq-ub
22+
ub-vc
23+
de-ta
24+
wq-aq
25+
wq-vc
26+
wh-yn
27+
ka-de
28+
kh-ta
29+
co-tc
30+
wh-qp
31+
tb-vc
32+
td-yn

0 commit comments

Comments
 (0)