added ex1
This commit is contained in:
parent
7312f8a293
commit
70daa208d0
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
|
||||
|
||||
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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user