64 lines
1.5 KiB
Python
64 lines
1.5 KiB
Python
|
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:
|
||
|
if g.red > total_red or g.blue > total_blue or g.green > total_green:
|
||
|
continue
|
||
|
sum += g.id
|
||
|
print(sum)
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|