diff --git a/src/ex3_cards.py b/src/ex3_cards.py new file mode 100644 index 0000000..262595b --- /dev/null +++ b/src/ex3_cards.py @@ -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] diff --git a/tests/test_ex3.py b/tests/test_ex3.py new file mode 100644 index 0000000..8236090 --- /dev/null +++ b/tests/test_ex3.py @@ -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()