import fs from "fs"; export const hash = (input: string): number => { const parts = input.split(''); let hash = 0; for (let i = 0; i < parts.length; i++) { hash += parts[i].charCodeAt(0); hash *= 17; hash %= 256; } return hash; } export const hashSum = (input: string): number => { return input.split(',').reduce((sum, part) => sum + hash(part), 0); } const focusingPower = (boxNumber: number, slot: number, value: number): number => { return (1 + boxNumber) * (1 + slot) * value; } export const totalFocusingPower = (input: string): number => { const boxes: [string, number][][] = new Array(256).fill(0).map(() => []); input.split(',').forEach(part => { if (part.includes('=')) { const [label, value] = part.split('='); const box = hash(label); const index = boxes[box].findIndex(([l]) => l === label); boxes[hash(label)].splice(index === -1 ? boxes[box].length : index, 1, [label, parseInt(value)]); } else { const [label] = part.split('-'); let box = hash(label); const index = boxes[box].findIndex(([l]) => l === label); if (index !== -1) { boxes[box].splice(index, 1); } } }); return boxes.reduce( (sum, box, boxIndex) => sum + box.reduce( (total, [label, value], slot) => { return total + focusingPower(boxIndex, slot, value) }, 0 ), 0 ); } export const runDayFifteen = () => { const input = fs.readFileSync('./inputs/day_fifteen_input.txt', 'utf-8').trimEnd(); console.log('Day Fifteen output:', totalFocusingPower(input)); }