const fs = require('fs'); const input = fs.readFileSync(__dirname + '/input.txt', 'utf8'); function createSecret(secret: bigint) { secret = ((secret << 6n) ^ secret) % 16777216n; secret = ((secret >> 5n) ^ secret) % 16777216n; return ((secret << 11n) ^ secret) % 16777216n; } let sum = 0n; const changeMap: { [key: string]: Array } = {}; input.split("\n").forEach((s: string, index: number) => { let seed = BigInt(parseInt(s)); let seedStr = ''+seed; const changes = []; for (let i = 0; i < 2000; i++) { const newSeed = createSecret(seed); const newSeedStr = ''+newSeed; const lastDig = parseInt(newSeedStr[newSeedStr.length - 1]); const diff = lastDig - parseInt(seedStr[seedStr.length - 1]); changes.push(diff); if (i > 3) { changes.shift(); const key = changes.join(','); if (!changeMap[key]) { changeMap[key] = []; } if (!changeMap[key][index]) { changeMap[key][index] = lastDig; } } seed = newSeed; seedStr = newSeedStr; } sum += seed; }); let highest: null|number = null; let highestSeq: null|string = null; for (let seq in changeMap) { const prices = changeMap[seq]; let priceSum = 0; prices.forEach((p) => { if (p) { priceSum += p; } }); if (!highest || priceSum > highest) { highest = priceSum; highestSeq = seq; } } console.log(sum, highest, highestSeq);