#!/usr/bin/env python # coding: utf-8 # # Cinquième exercice en Python (Niveau Lycée) # # Exemple 1 : `~O~O~O~OP` # Tous les rats vont bien vers le joueur de flûte, donc aucun n'est sourd. Valeur attendue = 0 # # Exemple 2 : `PO~O~~OO~` # Le rat souligné va dans la mauvaise direction, il est donc sourd. Valeur attendue = 1 # # Exemple 3 : `~OO~~O~OP~OO~O~` # Cette fois il y a 2 rats sourds. Valeur attendue = 2 # ## Séparer les rats à gauche et à droite du joueur de flûte # Une *première idée* est de récupérer les rats qui sont à **gauche** et à **droite** du joueur de flûte. Pour cela on utilise `split` : # In[1]: '~O~O~O~OP'.split('P') # In[2]: 'PO~O~~OO~'.split('P') # In[3]: '~OO~~O~OP~OO~O~'.split('P') # Ensuite, un rat sera sourd dans la partie **gauche** s'il y a un 'O' à une position **paire** (puisque l'on est censé avoir déjà la queue du rat puis la tête ~O et pas l'inverse). De la même façon, dans la partie **droite**, un rat est sourd si on trouve un 'O' à une position **impaire**. On pourrait donc imaginer faire 2 boucles, chacune ressemblant à : # #
for i in range(len(gauche)):
#   if gauche[i] == 'O' and i%2 == 0:   # un 'O' à une position paire
#     sourds += 1 
# # Une boucle suffit si on concatène **gauche** et **droite** (et que l'on retourne une des 2 chaines). C'est-à-dire passer de `['~OO~~O~O', '~OO~O~']` à l'unique chaine `'~OO~~O~O~O~OO~'` (on a retourné tous les rats qui étaient dans la partie **droite**). Les rats sourds sont ceux où il y a un 'O' à une position paire (rappel, en Python et JavaScript, le premier élément d'une chaine ou d'un tableau est à la position **0**). # Retourner une chaine en Python : # In[4]: 'bonjour'[::-1] # Il faut donc parcourir toutes les lettres de la chaine contenant les rats et regarder s'il y a un 'O' à une position paire. Pour cela on utilise `enumerate` qui permettra de récupérer à la fois le caractère et son rang : # In[5]: list(enumerate('~OO~~O~O~O~OO~')) # Vous avez tout pour comprendre cette version : # In[6]: def rats_sourds(town): [gauche, droite] = town.split('P') rats = gauche + droite[::-1] return sum([c == 'O' and i % 2 == 0 for i,c in enumerate(rats)]) # In[7]: rats_sourds('~O~O~O~OP') # In[8]: rats_sourds('PO~O~~OO~') # In[9]: rats_sourds('~OO~~O~OP~OO~O~') # ## A-t-on vraiment besoin de séparer la gauche et la droite ? # En observant un peu plus attentivement la chaine représentant une ville, par exemple `'~OO~~O~OP~OO~O~'`, on se rend compte que peu importe l'emplacement du joueur de flûte, il y aura un rat sourd dès qu'un `'O'` est observé à une position **paire**. Par exemple dans la ville `'P~OO~O~'`, la tête du rat sourd est bien à une position paire. # # *Finalement, il suffit de compter le nombre de 'O' qu'il y a dans la ville en n'ayant récupéré que les lettres qui sont aux positions paires.* # Il est très facile de récupérer une lettre sur 2 en Python : # In[10]: 'UneLettreSurDeux'[::2] # Et le programme final, beaucoup plus court suite à notre analyse : # In[11]: def rats_sourds(ville): return ville[::2].count('O') # In[12]: rats_sourds('~OO~~O~OP~OO~O~')