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
52import fs from 'fs/promises';
const file = await fs.readFile('input.txt', 'utf-8');
const lines = file.split(/\r?\n/); // handle windows and *nix
const split = lines.findIndex((v) => v === '');
const rules = lines.slice(0, split).map((rule) => rule.split('|'));
let pages = lines
.slice(split + 1)
.filter((p) => p !== '')
.map((page) => page.split(','));
const findBrokenRules = (rules, page) => {
let brokenRules = [];
rules.forEach((rule) => {
const index1 = page.findIndex((v) => v === rule[0]);
const index2 = page.findIndex((v) => v === rule[1]);
if (index1 < 0 || index2 < 0) return;
if (index1 > index2) {
brokenRules.push(rule);
}
});
return brokenRules;
};
pages = pages.map((page) => {
let brokenRules = findBrokenRules(rules, page);
if (!brokenRules.length) return [];
while (brokenRules.length) {
brokenRules.forEach((rule) => {
page = page.filter((i) => i !== rule[0]);
const largerIndex = page.findIndex((v) => v === rule[1]);
page.splice(largerIndex, 0, rule[0]);
});
brokenRules = findBrokenRules(rules, page);
}
return page;
});
const total = pages.reduce((a, page) => {
if (!page.length) return a;
const middleIndex = Math.floor(page.length / 2);
const middleNumber = +page[middleIndex];
return a + middleNumber;
}, 0);
console.log(total);