expeditaet
Version:
Advent of Code Solutions
44 lines (38 loc) • 1.18 kB
text/typescript
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { split, task } from '@alexaegis/advent-of-code-lib';
import { sum } from '@alexaegis/advent-of-code-lib/math';
import packageJson from '../package.json';
export const calcSegment = (input: string[]): string => {
let currentOperator = '+';
let i = 2;
while (input.length > 1) {
i = i % input.length;
if (!input.some((inp) => inp === '(' || inp === ')' || inp === '+')) {
currentOperator = '*';
}
if (
/^\d+$/.test(input[i - 2]!) &&
input[i - 1] === currentOperator &&
/^\d+$/.test(input[i]!)
) {
input[i - 2] = eval(`${input[i - 2]}${input[i - 1]}${input[i]}`) as string;
input.splice(i - 1, 2);
i = i - 2;
}
if (input[i] === '(') {
const segment = input.cutSubSegment(['(', ')'], i);
if (segment) {
const r = calcSegment(segment);
input.splice(i, 0, r); // Splice the result back
i--;
}
}
i++;
}
return input[0]!;
};
export const p2 = (input: string): number =>
split(input)
.map((line) => Number.parseInt(calcSegment([...line.replaceAll(' ', '')]), 10))
.reduce(sum, 0);
await task(p2, packageJson.aoc); // 297139939002972 ~262.85ms