import fs from "fs"; const input = fs.readFileSync("./input.txt").toString(); const COLORS = ["red", "green", "blue"] as const; type Color = (typeof COLORS)[number]; type Draw = Record; interface Game { id: number; draws: Draw[]; } function isPossible( game: Game, maxDraw: Draw = { red: 12, green: 13, blue: 14 }, ) { return game.draws.reduce((acc, draw) => { return ( acc && COLORS.every((color) => { return draw[color] <= maxDraw[color]; }) ); }, true); } function getMinimalPossibleDraw(draws: Draw[]) { return COLORS.reduce( (acc, color) => { acc[color] = draws.reduce((max, draw) => { return Math.max(draw[color], max); }, 0); return acc; }, { red: 0, green: 0, blue: 0 }, ); } function power(draw: Draw) { return Object.values(draw).reduce((product, value) => product * value, 1); } const result = input .split("\n") .slice(0, -1) .map((line) => { const [gameStr, drawsStr] = line.split(": "); const id = Number(gameStr.slice("Game ".length)); const draws = drawsStr.split("; ").map((record) => { const draws = record.split(", ").reduce( (acc, draw) => { const [number, color] = draw.split(" "); acc[color] = Number(number); return acc; }, { red: 0, green: 0, blue: 0 }, ); return draws; }); return { id, draws }; }) .map((game) => getMinimalPossibleDraw(game.draws)) .reduce((acc, draw) => acc + power(draw), 0); console.log({ result });