๐Ÿ“ฆ Svenlaa / aoc-2024-js

๐Ÿ“„ 5-2.js ยท 52 lines
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);