◂ 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; …
⋮
- 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)