import re class Game: def __init__(self, id, r=0, b=0, g=0): self.id = id self.red = r self.blue = b self.green = g def __str__(self): return f'game: {self.id}, max_red={self.red}, max_blue={self.blue}, max_green={self.green}' game_pattern = re.compile(r'Game ([0-9]+):\s(.*)') play_pattern = re.compile(r'([0-9]+)\s(red|green|blue)') total_red = 12 total_blue = 14 total_green = 13 def parse_game(line): m = game_pattern.search(line) plays = m.groups()[1].split('; ') game = Game(int(m.groups()[0])) for play in plays: counts = play.split(', ') for c in counts: r = b = g = 0 pm = play_pattern.search(c) if pm.groups()[1] == 'red': r = int(pm.groups()[0]) if pm.groups()[1] == 'blue': b = int(pm.groups()[0]) if pm.groups()[1] == 'green': g = int(pm.groups()[0]) game.red = max(game.red, r) game.blue = max(game.blue, b) game.green = max(game.green, g) return game def main(): games = [] with open('input', 'r') as f: while True: line = f.readline() if not line: break games.append(parse_game(line)) sum = 0 for g in games: power = g.red * g.blue * g.green sum += power print(sum) if __name__ == '__main__': main()