42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
|
|
const fs = require('fs');
|
||
|
|
|
||
|
|
const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
|
||
|
|
|
||
|
|
const rules: Array<[number, number]> = [];
|
||
|
|
const updates: Array<Array<number>> = [];
|
||
|
|
|
||
|
|
let rulesSection = true;
|
||
|
|
input.split("\n").forEach((line: string) => {
|
||
|
|
if (!line) {
|
||
|
|
rulesSection = false;
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (rulesSection) {
|
||
|
|
rules.push(line.split('|').map((s) => parseInt(s)) as [number, number]);
|
||
|
|
} else {
|
||
|
|
updates.push(line.split(',').map((s) => parseInt(s)));
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
let result = 0;
|
||
|
|
|
||
|
|
updates.forEach((update) => {
|
||
|
|
let newUpdate: Array<number> = [];
|
||
|
|
for (let page of update) {
|
||
|
|
const relevantRules = rules.filter((rule) => rule[0] === page || rule[1] === page);
|
||
|
|
let i = 0;
|
||
|
|
for (; i < newUpdate.length; i++) {
|
||
|
|
const otherPage = newUpdate[i];
|
||
|
|
const rule = relevantRules.find((rule) => rule[0] === otherPage || rule[1] === otherPage);
|
||
|
|
if (rule && rule[0] === page) {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
newUpdate = [...newUpdate.slice(0, i), page, ...newUpdate.slice(i)]
|
||
|
|
}
|
||
|
|
if (update.join(',') !== newUpdate.join(',')) {
|
||
|
|
result += newUpdate[(newUpdate.length - 1) / 2];
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
console.log(result);
|