const fs = require('fs'); const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); let stones: Array = input.slice(0, -1).split(' '); const countMap: { [key: string]: Array } = {}; let sum = 0; 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) { let last = stone.slice(len / 2); newStones = [stone.slice(0, len / 2), ''+parseInt(last)]; } else { newStones = [''+(parseInt(stone) * 2024)]; } } 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 = 75; stones.forEach((stone) => { sum += getCountAfter(stone, blinks); }); console.log(sum);