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) | ||||
		Reference in New Issue
	
	Block a user