Skip to content

Instantly share code, notes, and snippets.

@johannchopin
Last active November 14, 2017 19:56
Show Gist options
  • Save johannchopin/86bd67affb8c23ff513680ec6c1b5576 to your computer and use it in GitHub Desktop.
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
@johannchopin
Copy link
Author

Il passe tout les tests :)

@laowantong
Copy link

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?

@johannchopin
Copy link
Author

Est-ce une bonne idée de rajouter un test sur le counter au sein du test if previous_element == element: ?

@laowantong
Copy link

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.

@johannchopin
Copy link
Author

johannchopin commented Nov 11, 2017

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 ;)

@laowantong
Copy link

[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.

@johannchopin
Copy link
Author

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 ;)

@laowantong
Copy link

[Rev 4]
Bonne conclusion 😃

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment