summaryrefslogtreecommitdiff
path: root/day-2/script.ts
diff options
context:
space:
mode:
Diffstat (limited to 'day-2/script.ts')
-rw-r--r--day-2/script.ts52
1 files changed, 52 insertions, 0 deletions
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<Color, number>;
+
+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 });