diff --git a/2024/11/index.ts b/2024/11/index.ts index f80a96f..b60e284 100644 --- a/2024/11/index.ts +++ b/2024/11/index.ts @@ -8,32 +8,43 @@ const countMap: { [key: string]: Array } = {}; let sum = 0; -function getCountAfter(stone: string, blink: number) { - const newStones: Array = []; - stones.forEach((stone) => { - if (stone === '0') { - newStones.push('1'); - return; +function getCountAfter(stone: string, blink: number, prev: Array = []): number { + const nextStep = blink - 1; + if (countMap[stone]) { + if (countMap[stone][nextStep]) { + return countMap[stone][nextStep]; } + } else { + countMap[stone] = []; + } + let newStones: Array; + if (stone === '0') { + newStones = ['1']; + } else { const len = stone.length; if (len % 2 === 0) { - newStones.push(stone.slice(0, len / 2)); let last = stone.slice(len / 2); - newStones.push(''+(parseInt(last))); - return; + newStones = [stone.slice(0, len / 2), ''+parseInt(last)]; + } else { + newStones = [''+(parseInt(stone) * 2024)]; } - newStones.push(''+(parseInt(stone) * 2024)); - }); - if (blink === 1) { - return newStones; } - return newStones.sum((newStone) => getCountAfter(newStone, blink - 1)); + const len = newStones.length; + countMap[stone][0] = len; + if (blink === 1) { + 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; + } } -const blinks = 25; +const blinks = 75; stones.forEach((stone) => { - sum += getCountAfter(stone, 25); + sum += getCountAfter(stone, blinks); }); console.log(sum);