AlgoDS-Examen2024/src/ex3_cards.py
2025-01-16 11:26:17 +01:00

54 lines
1.7 KiB
Python

"""
Question 3 - Carte au paille
But : calculer le meilleur score possible au jeu. Le jeu consiste à choisir
tour à tour une des cartes à l'extrémité d'une ligne de cartes (gauche ou
droite). Lorsque toutes les cartes ont été prises, le joueur avec le plus
grand score gagne.
Approche :
Comme il s'agit d'un jeu à somme nul (un nombre de points fixe est en jeu et
réparti entre les joueurs à la fin de la partie), nous pouvons facilement
utiliser l'algorithme minimax pour optimiser notre score, tout en supposant que
notre adversaire fera de même.
Ainsi, nous essayons de maximiser la valeur scoreNous - scoreAdversaire, tandis
que notre adversaire essaie de la minimiser
"""
def tauntScore(cards: list[int]) -> int:
def minimax(
cards: list[int],
maximizing: bool = True,
gain: int = 0,
total: int = 0
) -> tuple[int, int]:
if len(cards) == 0:
return gain, total
gain_left, total_left = minimax(
cards[1:],
not maximizing,
gain + cards[0] if maximizing else gain - cards[0],
total + cards[0] if maximizing else total
)
gain_right, total_right = minimax(
cards[:-1],
not maximizing,
gain + cards[-1] if maximizing else gain - cards[-1],
total + cards[-1] if maximizing else total
)
if maximizing:
if gain_left > gain_right:
return gain_left, total_left
return gain_right, total_right
else:
if gain_left < gain_right:
return gain_left, total_left
return gain_right, total_right
return minimax(cards)[1]