From 5406a3a52036b95726f368d0b22f8c73da48f9a0 Mon Sep 17 00:00:00 2001 From: eug-vs Date: Sat, 2 Dec 2023 17:20:16 +0300 Subject: feat(day-2): add part 1 solution --- day-2/script.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 day-2/script.ts (limited to 'day-2/script.ts') diff --git a/day-2/script.ts b/day-2/script.ts new file mode 100644 index 0000000..4e29bbb --- /dev/null +++ b/day-2/script.ts @@ -0,0 +1,52 @@ +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 }); -- cgit v1.2.3