-
-
Save johannchopin/86bd67affb8c23ff513680ec6c1b5576 to your computer and use it in GitHub Desktop.
# ----Ma version (9.84 µs)---- | |
def longest_streak(elements): | |
counter = 1 | |
acc = [0] | |
previous_element = "" | |
for element in elements: | |
if previous_element == element: | |
counter += 1 | |
else: | |
counter = 1 | |
previous_element = element | |
acc += [counter] | |
return(max(acc)) | |
# ----La version (5.06 µs)---- | |
def longest_streak(elements): | |
counter = 0 | |
best_so_far = 0 | |
previous_element = None | |
for element in elements: | |
if element == previous_element: | |
counter += 1 | |
else: | |
counter = 1 | |
previous_element = element | |
if counter > best_so_far: | |
best_so_far = counter | |
return best_so_far |
Intéressante version, avec de bons noms (sauf pour streak
, qui signifie « séquence ininterrompue). C'est une méthode possible, et à laquelle je n'avais pas pensé. L'inconvénient est qu'elle nécessite de parcourir deux fois la séquence, une fois explicitement avec le for
, une fois implicitement avec la fonction max()
. Peux-tu faire la même chose avec un seul parcours?
Est-ce une bonne idée de rajouter un test sur le counter au sein du test if previous_element == element:
?
Je ne sais pas. Le problème de ta version est qu'elle n'inclut pas le schéma de recherche du meilleur élément, dont elle est censée être une application (ce schéma est dissimulé dans le max()
final). Essaie donc de repartir de ce schéma. La différence est qu'il faut traiter non seulement la rencontre d'un meilleur élément, mais aussi d'un élément équivalent. Mais le schéma de recherche est tout de même inclus dans l'algorithme.
Nouvelle version que je n'aime pas beaucoup bien qu'elle soit environs deux fois plus rapide que la précédente (5.99 µs contre 10.5 µs). A vous de juger maintenant ;)
[Rev 3]
Ah oui, intéressant, donc le premier programme était effectivement deux fois plus lent.
- Ton nouveau programme ne marche pas pour
longest_streak(["", 1, 2])
. acc
ne sert à rien, sans doute un reste de brouillon?- Les initialisations sont un peu trop complexes. En fait, cherche toujours des initialisations « naturelles » (i.e., qui sont correctes à l'étape 0).
- Peux-tu utiliser une variable dont le nom se termine par
_so_far
comme dans le schéma de recherche? Merci.
C'est un algorithme un peu complexe à mettre au point.
Bon comme pas mal de gens l'ont remarqué, la deuxième version est la meilleur (je n'ai pas réussi à faire un autre programme équivalent ET plus rapide comme vous pouvez le constater). Une prochaine fois peut être Grand Guidoux ;)
[Rev 4]
Bonne conclusion 😃
Il passe tout les tests :)