Files
AoC/2024/11/index.ts

52 lines
1.3 KiB
TypeScript
Raw Normal View History

2024-12-11 15:03:26 +00:00
const fs = require('fs');
const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
let stones: Array<string> = input.slice(0, -1).split(' ');
2024-12-11 15:37:44 +00:00
const countMap: { [key: string]: Array<number> } = {};
2024-12-11 15:03:26 +00:00
let sum = 0;
2024-12-11 16:13:31 +00:00
function getCountAfter(stone: string, blink: number, prev: Array<string> = []): number {
const nextStep = blink - 1;
if (countMap[stone]) {
if (countMap[stone][nextStep]) {
return countMap[stone][nextStep];
2024-12-11 15:03:26 +00:00
}
2024-12-11 16:13:31 +00:00
} else {
countMap[stone] = [];
}
let newStones: Array<string>;
if (stone === '0') {
newStones = ['1'];
} else {
2024-12-11 15:03:26 +00:00
const len = stone.length;
if (len % 2 === 0) {
let last = stone.slice(len / 2);
2024-12-11 16:13:31 +00:00
newStones = [stone.slice(0, len / 2), ''+parseInt(last)];
} else {
newStones = [''+(parseInt(stone) * 2024)];
2024-12-11 15:03:26 +00:00
}
2024-12-11 16:13:31 +00:00
}
const len = newStones.length;
countMap[stone][0] = len;
2024-12-11 15:37:44 +00:00
if (blink === 1) {
2024-12-11 16:13:31 +00:00
return len;
} else {
const newPrev = [...prev, stone];
const len = newStones.reduce((carry, newStone) => carry + getCountAfter(newStone, nextStep, newPrev), 0);
countMap[stone][nextStep] = len;
return len;
2024-12-11 15:37:44 +00:00
}
2024-12-11 15:03:26 +00:00
}
2024-12-11 16:13:31 +00:00
const blinks = 75;
2024-12-11 15:03:26 +00:00
2024-12-11 15:37:44 +00:00
stones.forEach((stone) => {
2024-12-11 16:13:31 +00:00
sum += getCountAfter(stone, blinks);
2024-12-11 15:37:44 +00:00
});
2024-12-11 15:03:26 +00:00
2024-12-11 15:37:44 +00:00
console.log(sum);
2024-12-11 15:03:26 +00:00