Écrivez une fonction qui prend une chaîne de lettres et d'espaces (pas besoin de gérer les non-lettres) et exécute l'algorithme de traduction ANNOUNCER VOICE comme suit:
- Tout d'abord, mettez tout en majuscules.
- Pour chaque mot,
- Allongez chaque groupe de consonnes en triplant chaque lettre; sauf que si le mot commence par un groupe de consonnes, ne pas allonger ce groupe. Par exemple,
other
devrait devenirOTTTHHHEEERRR
maismother
devrait devenirMOTTTHHHEEERRR
. - Allongez la voyelle finale en la triplant.
- Allongez chaque groupe de consonnes en triplant chaque lettre; sauf que si le mot commence par un groupe de consonnes, ne pas allonger ce groupe. Par exemple,
- Dans les deux cas d' allongement , si vous triplez une lettre, commencez par la fusionner avec des lettres en double de chaque côté. Par exemple,
hill
devrait devenirHIIILLL
etbookkeeper
devrait devenirBOOKKKEEPPPEEERRR
. - Aux fins de ce défi,
y
compte comme une consonne. - Clarification / simplification: vous pouvez supposer que chaque paire de mots est séparée par un seul espace, que l'entrée ne contient aucun espace consécutif et que l'entrée ne sera pas la chaîne vide.
- Le code le plus court gagne!
Vecteurs de test:
> sunday sunday
SUNNNDDDAAAYYY SUNNNDDDAAAYYY
> mia hamm
MIAAA HAAAMMM
> chester alan arthur
CHESSSTTTEEERRR ALLLAAANNN ARRRTTTHHHUUURRR
> attention please
ATTTENNNTTTIOOONNN PLEASSSEEE
> supercalifragilisticexpialidocious
SUPPPERRRCCCALLLIFFFRRRAGGGILLLISSSTTTICCCEXXXPPPIALLLIDDDOCCCIOUUUSSS
> moo
MOOO
> Aachen
AACCCHHHEEENNN
> Oooh
OOOHHH
> grifffest
GRIFFFEEESSSTTT
> k
K
> aaaabbbbc
AAAABBBBCCC
Voici une implémentation de référence à laquelle je passerais à une réponse, sauf que depuis ce matin, la question est close. : P
import itertools,re
def j(s):return re.match('^[AEIOU]+$',s)
def c(s):return ''.join(sum(([h,h,h]for h in[k for k,g in itertools.groupby(s)]),[]))
def v(s):
while len(s)>=2 and s[-2]==s[-1]:s=s[:-1]
return s+s[-1]+s[-1]
def a(n):
r=''
for w in n.split():
if r:r+=' '
ss=re.split('([AEIOU]+)', w.upper())
for i,s in enumerate(ss):
r += [v(s),s][any(j(t) for t in ss[i+1:])]if j(s)else[s,c(s)][i>0]
return r
while 1:print a(raw_input('> '))