advent-of-code/2023/day02/day02.ts
2024-11-12 21:46:18 +01:00

57 lines
1.4 KiB
TypeScript

// const input: string = await Bun.file("input").text();
import { readFileSync } from "node:fs";
const input: string = readFileSync("input", "utf8");
type Reveal = {
red: number;
green: number;
blue: number;
};
type Game = { id: number; reveals: Reveal[] };
function parse_reveal(reveal_str: string): Reveal {
let r = { red: 0, green: 0, blue: 0 };
reveal_str
.split(", ")
.map((s) => (r[s.split(" ")[1]] = Number(s.split(" ")[0])));
return r;
}
function parse_game(game_str: string): Game {
let [game, reveals] = game_str.split(": ");
let game_id = Number(game.split(" ")[1]);
let r = reveals.split("; ").map(parse_reveal);
return { id: game_id, reveals: r };
}
let games = input
.split("\n")
.filter((s) => s.length > 0)
.map(parse_game);
let part1 = (games: Game[]): number =>
games
.filter((g) =>
g.reveals.every((r) => r.red <= 12 && r.green <= 13 && r.blue <= 14),
)
.map((g) => g.id)
.reduce((a, b) => a + b);
let part2 = (games: Game[]): number =>
games
.map((g) =>
g.reveals.reduce(
(o, r) => ({
red: Math.max(o.red, r.red),
green: Math.max(o.green, r.green),
blue: Math.max(o.blue, r.blue),
}),
{ red: 0, green: 0, blue: 0 },
),
)
.map((r) => r.red * r.green * r.blue)
.reduce((a, b) => a + b);
console.log(part1(games));
console.log(part2(games));