added exercise 3
This commit is contained in:
parent
84fde862e1
commit
160a79906d
53
src/ex3_cards.py
Normal file
53
src/ex3_cards.py
Normal 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
20
tests/test_ex3.py
Normal 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()
|
Loading…
x
Reference in New Issue
Block a user