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