added exercise 3

This commit is contained in:
Louis Heredero 2025-01-16 11:21:53 +01:00
parent 84fde862e1
commit 160a79906d
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
2 changed files with 73 additions and 0 deletions

53
src/ex3_cards.py Normal file
View File

@ -0,0 +1,53 @@
"""
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]

20
tests/test_ex3.py Normal file
View File

@ -0,0 +1,20 @@
import unittest
from ex3_cards import tauntScore
class MyTestCase(unittest.TestCase):
def test_simple1(self):
self.assertEqual(
tauntScore([1, 3, 2, 2]),
5
)
def test_simple2(self):
self.assertEqual(
tauntScore([1, 3, 45, 12, 2, 12]),
58
)
if __name__ == '__main__':
unittest.main()