| import { readFileSync } from 'fs' |
| |
| interface Game { |
| id: number, |
| red: number, |
| blue: number, |
| green: number |
| } |
| |
| const input: string[] | Game[] = readFileSync('./input.txt').toString().split('\n'); |
| |
| function getCubes(string: string, color?: 'red' | 'green' | 'blue'): number { |
| let regexp: RegExp; |
| switch (color) { |
| case 'red': { |
| regexp = /(\d+) red/g; |
| break; |
| } |
| case 'green': { |
| regexp = /(\d+) green/g; |
| break; |
| } |
| case 'blue': { |
| regexp = /(\d+) blue/g; |
| break; |
| } |
| default: { |
| regexp = /Game (\d+):/g; |
| break; |
| } |
| } |
| const matches = string.matchAll(regexp) |
| let max = 0; |
| for (const match of matches) { |
| if(parseInt(match[1]) > max) max = parseInt(match[1]) |
| } |
| |
| return max |
| |
| } |
| |
| const formatted = input.map(game => { |
| |
| const id = getCubes(game) |
| const red = getCubes(game, 'red') |
| const blue = getCubes(game, 'blue') |
| const green = getCubes(game, 'green') |
| |
| return { |
| id, |
| red, |
| green, |
| blue |
| } as Game |
| }) |
| |
| const maxes = { |
| red: 12, |
| green: 13, |
| blue: 14 |
| }; |
| |
| // Part One |
| ((games: Game[]) => { |
| let sum = 0; |
| for(const game of games) { |
| if( |
| game.red <= maxes.red && |
| game.blue <= maxes.blue && |
| game.green <= maxes.green |
| ) sum += game.id |
| } |
| console.log(sum) |
| })(formatted); |
| |
| //Part Two |
| ((games: Game[]) => { |
| let sum = 0; |
| for(const game of games) { |
| sum += game.red * game.green * game.blue |
| } |
| console.log(sum) |
| })(formatted); |