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); } 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 }; }) .filter((game) => isPossible(game)) .reduce((acc, game) => acc + game.id, 0); console.log({ result });