Advent-of-Code-2022/13/solution.mjs

54 lines
1.4 KiB
JavaScript
Raw Normal View History

2022-12-12 22:18:40 -08:00
import { readFileSync } from 'node:fs';
const input = readFileSync('input', 'utf-8');
const pairs = input
.split('\n\n')
.map(pair => pair
.split('\n')
.filter(line => line)
.map(line => JSON.parse(line))
);
export function compare(left, right) {
const leftIsArray = Array.isArray(left);
const rightIsArray = Array.isArray(right);
const compareArrays = leftIsArray || rightIsArray;
if (leftIsArray && !rightIsArray) {
right = [right];
}
if (rightIsArray && !leftIsArray) {
left = [left];
}
if (compareArrays) {
for (let i = 0; i < Math.max(left.length, right.length); i++) {
if (i >= left.length) return -1;
if (i >= right.length) return 1;
const result = compare(left[i], right[i]);
if (result !== 0) return result;
}
return 0;
} else {
return (left - right) / Math.abs(left - right || 1);
}
}
const sumOfIndices = pairs
.map(([left, right], i) => [i + 1, compare(left, right)])
.filter(([_index, result]) => result === -1)
.reduce((total, [index, _result]) => total + index, 0);
console.log(`Sum of correctly ordered inices: ${sumOfIndices}`);
const dividerPackets = [[[2]], [[6]]];
const allPackets = [...pairs.flat(), ...dividerPackets];
allPackets.sort(compare);
const decoderKey = dividerPackets
.map(packet => allPackets.indexOf(packet) + 1)
.reduce((total, index) => total * index);
console.log(`Decoder key: ${decoderKey}`);