Files
advent-of-code/day-5/day5.ts
2024-12-05 12:07:46 +01:00

90 lines
1.9 KiB
TypeScript

export function day5(input: string) {
let result = 0;
const [rulesStr, updatesStr] = input.split("\n\n");
const rules = rulesStr.split("\n").map((x) => x.split("|"));
const updates = updatesStr.split("\n").map((x) => x.split(","));
for (const update of updates) {
let isValid = true;
for (let i = 0; i < rules.length; i++) {
const rule = rules[i];
const x = rule[0];
const y = rule[1];
const xIndex = update.indexOf(x);
const yIndex = update.indexOf(y);
if (xIndex === -1 || yIndex === -1) {
continue;
}
if (yIndex < xIndex) {
console.log("not valid", {
x,
y,
xIndex,
yIndex,
update,
});
isValid = false;
break;
}
}
if (isValid) {
const middleValue = update[Math.floor(update.length / 2)];
result += Number.parseInt(middleValue);
}
}
return result;
}
export function day5part2(input: string) {
let result = 0;
const [rulesStr, updatesStr] = input.split("\n\n");
const rules = rulesStr.split("\n").map((x) => x.split("|"));
const updates = updatesStr.split("\n").map((x) => x.split(","));
const invalidUpdates = [];
for (const update of updates) {
let isValid = true;
for (let i = 0; i < rules.length; i++) {
const rule = rules[i];
const x = rule[0];
const y = rule[1];
const xIndex = update.indexOf(x);
const yIndex = update.indexOf(y);
if (xIndex === -1 || yIndex === -1) {
continue;
}
if (yIndex < xIndex) {
isValid = false;
break;
}
}
if (!isValid) {
invalidUpdates.push(update);
}
}
for (const update of invalidUpdates) {
update.sort((a, b) => {
const rule = rules.find((v) => v.includes(a) && v.includes(b));
if (!rule) {
return 0;
}
if (rule[0] === a) {
return -1;
}
return 1;
});
const middleValue = update[Math.floor(update.length / 2)];
result += Number.parseInt(middleValue);
}
return result;
}