added ex1
This commit is contained in:
		
							
								
								
									
										57
									
								
								src/Ex1.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								src/Ex1.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | |||||||
|  |  | ||||||
|  | """ | ||||||
|  | Nom/Prénom: Heredero/Louis | ||||||
|  | Explications: | ||||||
|  |  | ||||||
|  | Une approche serait de trier la liste des valeurs par ordre croissant | ||||||
|  | Une fois triée, nous pouvons comparer les valeurs absolues des 2 extrémités : | ||||||
|  | - Si elles sont égales, nous avons une touche complète supplémentaire (nous les enlevons de la liste) | ||||||
|  | - Sinon, nous enlevons celle avec la plus grande valeur absolue | ||||||
|  |  | ||||||
|  | NB: Afin de ne compter que les paires distinctes, nous pouvons soit transformer | ||||||
|  | la liste en `set` (retire les valeurs à double), soit garder une liste des valeurs | ||||||
|  | de touches complètes trouvées | ||||||
|  | Cela permettrait aussi peut-être d'améliorer l'efficacité de l'algorithme de la manière suivante: | ||||||
|  | - Créer deux `set` : valeurs positives et valeurs négatives (stocker la valeur | ||||||
|  |   absolue des valeurs négatives dans le `set`) | ||||||
|  | - Calculer l'intersection des deux `set` : | ||||||
|  |   `intersection = positives.intersection(negatives)` | ||||||
|  | - Le nombre de touches complètes est la taille de cette intersection : | ||||||
|  |   `complete = len(intersection)` | ||||||
|  |  | ||||||
|  | Par exemple : | ||||||
|  | list = [-3, -2, -1, 1, 2, 5] -> |-3| != |5| -> on enlève 5 | ||||||
|  | list = [-3, -2, -1, 1, 2] -> |-3| != |2| -> on enlève -3 | ||||||
|  | list = [-2, -1, 1, 2] -> |-2| = |2| -> une touche complète | ||||||
|  | list = [-1, 1] -> |-1| = |1| -> une autre touche complète | ||||||
|  | list = [] | ||||||
|  | """ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def countKey(pieces: list[int])->int: | ||||||
|  |     pieces = sorted(pieces) | ||||||
|  |     complete: int = 0 | ||||||
|  |  | ||||||
|  |     while len(pieces) >= 2: | ||||||
|  |         a, b = pieces[0], pieces[-1] | ||||||
|  |  | ||||||
|  |         # Si toutes les pièces restantes sont de même signe, on peut s'arrêter | ||||||
|  |         if a >= 0 or b <= 0: | ||||||
|  |             break | ||||||
|  |  | ||||||
|  |         abs_a, abs_b = abs(a), abs(b) | ||||||
|  |         if abs_a == abs_b: | ||||||
|  |             complete += 1 | ||||||
|  |             pieces = pieces[1:-1] | ||||||
|  |         elif abs_a < abs_b: | ||||||
|  |             pieces.pop(-1) | ||||||
|  |         else: | ||||||
|  |             pieces.pop(0) | ||||||
|  |  | ||||||
|  |     return complete | ||||||
|  |  | ||||||
|  |  | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     #print(countKey([-3, 4, 2, 8, 9, 1, -3, -8, -4, 2, 8, 2, -8, 1, 3]) == 3) | ||||||
|  |     print(countKey([-3, 4, 2, 8, 9, 1, -3, -8, -4, 2, 8, 2, -8, 1, 3]) == 4) | ||||||
|  |     print(countKey([-4, 5, 6, -1500, 4, 7, 49, 60, -60, 82, -41, 1500, 1, -7]) == 4) | ||||||
| @@ -1,8 +1,26 @@ | |||||||
| import unittest | import unittest | ||||||
|  |  | ||||||
|  | from Ex1 import countKey | ||||||
|  |  | ||||||
|  |  | ||||||
| class MyTestCase(unittest.TestCase): | class MyTestCase(unittest.TestCase): | ||||||
|     def test_simple1(self): |     def test_simple1(self): | ||||||
|         pass |         self.assertEqual( | ||||||
|  |             countKey([-3, 4, 2, 8, 9, 1, -3, -8, -4, 2, 8, 2, -8, 1, 3]), | ||||||
|  |             4 | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     def test_simple2(self): | ||||||
|  |         self.assertEqual( | ||||||
|  |             countKey([-4, 5, 6, -1500, 4, 7, 49, 60, -60, 82, -41, 1500, 1, -7]), | ||||||
|  |             4 | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     def test_simple3(self): | ||||||
|  |         self.assertEqual( | ||||||
|  |             countKey([-3, -2, -1, 1, 2, 5]), | ||||||
|  |             2 | ||||||
|  |         ) | ||||||
|  |  | ||||||
| if __name__ == '__main__': | if __name__ == '__main__': | ||||||
|     unittest.main() |     unittest.main() | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user