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('> '))

Respuestas:
APL (Dyalog) , 175 bytes
Pruébalo en línea!
⍞solicitud de entrada de caracteres1(819⌶)convertir a mayúsculas (819 ≈ grande)⊢pasar el resultado aún más (sirve para separar las cuerdas y el 1)'$| |^'⎕R' 'R eplace:el final, cualquier espacio y el principio
→ dos espacios
⊢pasar el resultado aún más (sirve para separar dos grupos de cadenas)'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:cualquier número de vocales idénticas y cualquier número de no vocales y un espacio
→ la vocal tres veces y las consonantes no modificadas
un espacio y una vocal
→ ellos mismos
un espacio y un grupo de consonantes
→ ellos mismos
una serie de consonantes idénticas
→ tres de esas vocales
'[AEIOU][^AEIOU]+ '⎕R{…}R eplace:una serie de no vocales y un espacio
→ el resultado de la siguiente función anónima con el espacio de nombres
⍵como argumento:⍵.Matchel texto que se encontróm←asigna eso param2≠/emparejar de manera diferente:3×multiplicar por tres1,prefierenm/⍨usar para replicarm⊢pasar el resultado aún más (sirve para separar dos cadenas)' +'⎕R' 'R eplace:uno o más espacios
→ con un solo espacio
1↓suelte la letra inicial (un espacio)fuente
1↓' +'⎕R' '⊢'[AEIOU][^AEIOU]+ '⎕R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R(s,'\2')'&' '&'(s←6⍴'\1')⊢'$| |^'⎕R' '⊢1(819⌶)⍞JS (ES6),
138134129 bytesWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Contiene
AEIOU3 veces, pero no puedo convertirlas en una.-4 bytes gracias a HyperNeutrino
Sin golf
Me gusta escribir, no leer código.
fuente
s=>/[AEIOU]/.test(s)con/[AEIOU]/.test?WAAAYYY TOOO MAAANNNYYY BYTEEESSS(es decir, no alargue el clúster inicialBYT).APL, 90 bytes
Explicación:
1(819⌶)⍵: convertir a mayúsculasw⊂⍨w=⊃w←' ',: dividido en espacios{...}¨: por cada palabra ...s←{⍵⊂⍨1,2≠/⍵}:ses una función que divide una cadena en grupos de caracteres coincidentes contiguos⍵∊'AEIOU': marca las vocales(...): ver qué caracteres triplicar~∧∨\: todas las consonantes pasan la primera vocal,{⌽<\⌽⍵}: la última vocal.2×: multiplica el vector de bits por dos,1+: y agrega uno. Ahora todos los personajes seleccionados tienen3y el resto tiene1.⍵/⍨: replica cada personaje en⍵la cantidad dadax←s: divídalo en cadenas de caracteres coincidentes y almacénelo enx.(3⌈≢¨s⍵): la longitud de cada grupo de caracteres coincidentes en la palabra de entrada, con un máximo de 3.⌊≢¨: el mínimo de eso y las longitudes de los grupos enx.x↑⍨¨: hacer que cada grupo tenga esa longitud1↓∊: aplana el resultado y suelta el primer carácter (el espacio que se agregó al principio para ayudar a dividir)fuente
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞Python, 417 bytes
Aquí hay una implementación de referencia en Python. No terriblemente golfizado.
Prueba con:
fuente
ssaS?Python 3 , 238 bytes
Pruébalo en línea!
fuente
va'AEIOU'?v.Perl 5 , 139 + 1 (-p) = 140 bytes
Pruébalo en línea!
Incluso maneja el caso de prueba "aaaabbbbc" de acuerdo con el ejemplo.
fuente