54 lines
1.7 KiB
Python
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]
|