Advent of code

 2 décembre 2023 

  Cube Conundrum : Parser un fichier et déterminer le nombre de cubes dans un sac
Game 1: 1 red, 5 blue, 1 green; 16 blue, 3 red
   
Game 2: 4 blue; 4 red, 3 blue, 1 green;
   
                       
  1. code.py
import math
from typing import Final
from collections import defaultdict

Show = defaultdict[str, int]


class Game:
    """Une classe représentant un "game", soit un sac duquel on sort à
    différents "shows" un certain nombre d'objets rouges, verts et bleus."""
    
    COULEURS: Final = ('red', 'green', 'blue')
    __slots__ = {'number':
                     "Le numéro du game",
                 '__shows':
                     "La liste des sorties du sac",
                 '__min_colors':
                     """Mise en cache du minimum qu'il faut pour que les sorties,
                        soient possibles, calculé une seule fois à la création"""}
    
    number: int
    __shows: list[Show] 
    __min_colors: Show
    

    def __init__(self, line: str):
        game, shows = line.split(': ')
        DEBUT_A_ENLEVER = 'Game '
        self.number = int(game[len(DEBUT_A_ENLEVER):])
        self.__shows  = Game.__parse_shows(shows)
        self.__min_colors = self.__calc_min_colors()

    @staticmethod
    def __parse_shows(line: str) -> list:
        shows = []
        for sortie in line.split('; '):
            show = defaultdict(int)
            for desc_couleur in sortie.split(', '):
                nb, couleur = desc_couleur.split(' ')
                assert couleur in Game.COULEURS
                show[couleur] = int(nb)
            shows.append(show)
        return shows

    def __calc_min_colors(self) -> Show:
        mins:Show = defaultdict(int)
        for show in self.__shows:
            for couleur in Game.COULEURS:
                mins[couleur] = max(mins[couleur], show[couleur])
        return mins

    def is_possible(self, nb_par_couleurs: dict) -> bool:
        for couleur in nb_par_couleurs:
            if self.__min_colors[couleur] > nb_par_couleurs[couleur]:
                return False
        return True

    def calc_power(self) -> int:
        return math.prod(self.__min_colors.values())

        

reponse_partie1 = 0
reponse_partie2 = 0

f = open("input.txt", 'r', encoding="utf-8")
lines = [line[:-1] for line in f.readlines()]
for line in lines:
    game = Game(line)
    if game.is_possible({'red':12, 'green':13, 'blue':14}):
        reponse_partie1 += game.number
    reponse_partie2 += game.calc_power()

print("Réponse partie 1:", reponse_partie1)
print("Réponse partie 2:", reponse_partie2)