const fs = require('fs'); const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); const rules: Array<[number, number]> = []; const updates: Array> = []; 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 = []; 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);