added ex1

This commit is contained in:
Louis Heredero 2025-01-28 13:53:10 +01:00
parent 7312f8a293
commit 70daa208d0
Signed by: HEL
GPG Key ID: 8D83DE470F8544E7
2 changed files with 76 additions and 1 deletions

57
src/Ex1.py Normal file
View 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)

View File

@ -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()