Skip to content

Commit 4a85d67

Browse files
committed
05/2025
1 parent 86f4d7d commit 4a85d67

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

2024/05/index.ts

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import { getPuzzle } from "../../utils";
2+
3+
const puzzleInput = getPuzzle(__dirname).trim();
4+
5+
let [_orderingRules, _pagesToProduce] = puzzleInput.split("\n\n");
6+
7+
const orderingRules = _orderingRules
8+
.split("\n")
9+
.map((row) => row.split("|").map((num) => parseInt(num)));
10+
11+
const pagesToProduce = _pagesToProduce
12+
.split("\n")
13+
.map((row) => row.split(",").map((num) => parseInt(num)));
14+
15+
const arePagesValid = (row: number[]) => {
16+
let isValid = true;
17+
18+
for (let j = 0; j < row.length; j++) {
19+
const page = row[j];
20+
const relevantRules = orderingRules.filter((rule) => rule.includes(page));
21+
22+
if (!relevantRules.length) {
23+
break;
24+
}
25+
26+
for (let k = 0; k < row.length; k++) {
27+
const otherPage = row[k];
28+
if (k === j) {
29+
continue;
30+
}
31+
32+
const rule = relevantRules.find((rule) => rule.includes(otherPage));
33+
34+
if (
35+
(k < j && rule.indexOf(otherPage) === 1) ||
36+
(k > j && rule.indexOf(otherPage) === 0)
37+
) {
38+
isValid = false;
39+
break;
40+
}
41+
}
42+
43+
if (!isValid) {
44+
break;
45+
}
46+
}
47+
48+
return isValid;
49+
};
50+
51+
// Part 1
52+
(() => {
53+
console.time("part 1");
54+
55+
let total = 0;
56+
57+
for (let i = 0; i < pagesToProduce.length; i++) {
58+
const row = pagesToProduce[i];
59+
let isValid = arePagesValid(row);
60+
61+
if (isValid) {
62+
total += row[Math.floor(row.length / 2)];
63+
}
64+
}
65+
66+
console.log("total part 1 ::", total);
67+
console.timeEnd("part 1");
68+
})();
69+
70+
// Part 2
71+
(() => {
72+
console.time("part 2");
73+
74+
let total = 0;
75+
let invalidUpdates: typeof orderingRules = [];
76+
77+
for (let i = 0; i < pagesToProduce.length; i++) {
78+
const row = pagesToProduce[i];
79+
let isValid = arePagesValid(row);
80+
81+
if (!isValid) {
82+
invalidUpdates.push(row);
83+
}
84+
}
85+
86+
for (let i = 0; i < invalidUpdates.length; i++) {
87+
const row = [...invalidUpdates[i]];
88+
89+
row.sort((a, b) => {
90+
const rule = orderingRules.find(
91+
(rule) =>
92+
(rule[0] === a && rule[1] === b) || (rule[0] === b && rule[1] === a)
93+
);
94+
95+
if (rule[0] === a) {
96+
return -1;
97+
}
98+
99+
if (rule[1] === a) {
100+
return 1;
101+
}
102+
103+
return 0;
104+
});
105+
106+
total += row[Math.floor(row.length / 2)];
107+
}
108+
109+
console.log("total part 2 ::", total);
110+
console.timeEnd("part 2");
111+
})();

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
| Day | Part 1 | Part 2 |
88
| :---------------------------------------: | :----: | :----: |
9+
| [05](https://adventofcode.com/2024/day/5) ||  ✅ |
910
| [04](https://adventofcode.com/2024/day/4) ||  ✅ |
1011
| [03](https://adventofcode.com/2024/day/3) ||  ✅ |
1112
| [02](https://adventofcode.com/2024/day/2) ||  ✅ |

0 commit comments

Comments
 (0)