added exercise 3
This commit is contained in:
		
							
								
								
									
										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() | ||||
		Reference in New Issue
	
	Block a user