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
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
:
'~O~O~O~OP'.split('P')
['~O~O~O~O', '']
'PO~O~~OO~'.split('P')
['', 'O~O~~OO~']
'~OO~~O~OP~OO~O~'.split('P')
['~OO~~O~O', '~OO~O~']
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 :
'bonjour'[::-1]
'ruojnob'
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 :
list(enumerate('~OO~~O~O~O~OO~'))
[(0, '~'), (1, 'O'), (2, 'O'), (3, '~'), (4, '~'), (5, 'O'), (6, '~'), (7, 'O'), (8, '~'), (9, 'O'), (10, '~'), (11, 'O'), (12, 'O'), (13, '~')]
Vous avez tout pour comprendre cette version :
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)])
rats_sourds('~O~O~O~OP')
0
rats_sourds('PO~O~~OO~')
1
rats_sourds('~OO~~O~OP~OO~O~')
2
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 :
'UneLettreSurDeux'[::2]
'UeeteuDu'
Et le programme final, beaucoup plus court suite à notre analyse :
def rats_sourds(ville):
return ville[::2].count('O')
rats_sourds('~OO~~O~OP~OO~O~')
2