From 70daa208d07a64b9237f03d9fb7a22badce9d874 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Tue, 28 Jan 2025 13:53:10 +0100 Subject: [PATCH] added ex1 --- src/Ex1.py | 57 +++++++++++++++++++++++++++++++++++++++++++++++ tests/test_ex1.py | 20 ++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 src/Ex1.py diff --git a/src/Ex1.py b/src/Ex1.py new file mode 100644 index 0000000..fbcaa61 --- /dev/null +++ b/src/Ex1.py @@ -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) diff --git a/tests/test_ex1.py b/tests/test_ex1.py index b24a888..697f3bf 100644 --- a/tests/test_ex1.py +++ b/tests/test_ex1.py @@ -1,8 +1,26 @@ import unittest +from Ex1 import countKey + + class MyTestCase(unittest.TestCase): 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__': unittest.main()