Escriba una función que tome una cadena de letras y espacios (no es necesario manejar no letras) y realice el algoritmo de traducción ANOUNCER VOICE de la siguiente manera:
- Primero, todo en mayúscula.
- Por cada palabra
- Alarga cada grupo de consonantes triplicando cada letra; excepto, si la palabra comienza con un grupo de consonantes, no alargue ese grupo. Por ejemplo,
otherdebería convertirseOTTTHHHEEERRRperomotherdebería convertirseMOTTTHHHEEERRR. - Alarga la vocal final triplicándola.
- Alarga cada grupo de consonantes triplicando cada letra; excepto, si la palabra comienza con un grupo de consonantes, no alargue ese grupo. Por ejemplo,
- En ambos casos de alargamiento , si está triplicando una letra, primero únala con letras duplicadas a cada lado. Por ejemplo,
hilldebería convertirseHIIILLLybookkeeperdebería convertirseBOOKKKEEPPPEEERRR. - Para los propósitos de este desafío,
ycuenta como una consonante. - Aclaración / simplificación: puede suponer que cada par de palabras está separado por un solo espacio, y que la entrada no contiene espacios consecutivos, y que la entrada no será la cadena vacía.
- ¡El código más corto gana!
Vectores de prueba:
> 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
Aquí hay una implementación de referencia que pasaría a una respuesta, excepto que a partir de esta mañana la pregunta se ha cerrado. :PAG
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('> '))