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