ANNNOUNNNCCCEEERRR VOICCCEEE

18

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 convertirse OTTTHHHEEERRRpero motherdebería convertirse MOTTTHHHEEERRR.
    • Alarga la vocal final triplicándola.
  • En ambos casos de alargamiento , si está triplicando una letra, primero únala con letras duplicadas a cada lado. Por ejemplo, hilldebería convertirse HIIILLLy bookkeeperdebería convertirse BOOKKKEEPPPEEERRR.
  • 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('> '))
Quuxplusone
fuente
2
Una solicitud para el futuro: evite palabras y frases como agrupación de consonantes , fusión y alargamiento . Un hablante no nativo de inglés como yo podría necesitar un diccionario para entender tu publicación.
Dennis
Deben ser las vocales que son "alargadas" :(
Devil's Advocate
¿Qué es el grupo de consonantes?
MilkyWay90

Respuestas:

6

APL (Dyalog) , 175 bytes

1' +'R' ''[AEIOU][^AEIOU]+ 'R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'R'\1\1\1\2' '&' '&' '\1\1\1''$| |^'R'  '1(819⌶)⍞

Pruébalo en línea!

 solicitud de entrada de caracteres

1(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:
  ⍵.Match el texto que se encontró
  m← asigna eso para m
  2≠/ emparejar de manera diferente:
   multiplicar por tres
  1, prefieren
  m/⍨ 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)

Adán
fuente
¿Esto funciona? 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⌶)⍞
Zacharý
^ Ahorra dos bytes si funciona ^
Zacharý
5

JS (ES6), 138 134 129 bytes

s=>s.toUpperCase()[r="replace"](/(\w)\1/g,"$1")[r](/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s)[r](/\B./g,s=>/[AEIOU]/.test(s)?s:s+s+s)

WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Contiene AEIOU3 veces, pero no puedo convertirlas en una.

-4 bytes gracias a HyperNeutrino

Sin golf

function v(str){
    return str.toUpperCase().replace(/(\w)\1/g,"$1").replace(/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s).replace(/\B./g,s=>[..."AEIOU"].includes(s)?s:s+s+s);
}

Me gusta escribir, no leer código.

ABot
fuente
1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... está en primer lugar, por delante de APL.
Zacharý
No sé JS, pero ¿puedes reemplazarlo s=>/[AEIOU]/.test(s)con /[AEIOU]/.test?
musicman523
@ musicman523 lamentablemente, no, porque es el condicional en una declaración de operador ternario.
ABot
Para su información, su manejo de grupos de consonantes parece ser ligeramente incorrecto; la salida adecuada sería WAAAYYY TOOO MAAANNNYYY BYTEEESSS(es decir, no alargue el clúster inicial BYT).
Quuxplusone
Bueno, estaba en primer lugar.
Zacharý
5

APL, 90 bytes

{1↓∊{s←{⍵⊂⍨1,2≠/⍵}⋄x↑⍨¨(3⌈≢¨s⍵)⌊≢¨x←s⍵/⍨(1+2×{⌽<\⌽⍵}∨~∧∨\)⍵∊'AEIOU'}¨w⊂⍨w=⊃w←' ',1(819⌶)⍵}

Explicación:

  • 1(819⌶)⍵: convertir a mayúsculas
  • w⊂⍨w=⊃w←' ',: dividido en espacios
  • {... : por cada palabra ...
    • s←{⍵⊂⍨1,2≠/⍵}: s es 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.
      • : multiplica el vector de bits por dos,
      • 1+: y agrega uno. Ahora todos los personajes seleccionados tienen 3y el resto tiene 1.
    • ⍵/⍨: replica cada personaje en la cantidad dada
    • x←s: divídalo en cadenas de caracteres coincidentes y almacénelo en x .
    • (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 en x.
    • x↑⍨¨: hacer que cada grupo tenga esa longitud
  • 1↓∊: aplana el resultado y suelta el primer carácter (el espacio que se agregó al principio para ayudar a dividir)
marinus
fuente
Le ganaste a Adám ... wow.
Zacharý
¡muy aseado! Si lo barajas un poco y lo escribes como un programa (usando el prompt como lo sugiere Adám) puedes eliminar otros 15 bytes:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil
3

Python, 417 bytes

Aquí hay una implementación de referencia en Python. No terriblemente golfizado.

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

Prueba con:

while True:
 print a(raw_input('> '))
Quuxplusone
fuente
¿No deberías al menos jugar golf un poco más al eliminar espacios innecesarios y cambiar ssa S?
Zacharý
2

Python 3 , 238 bytes

def f(s):
 s=s.upper();k=[s[0]];s=''.join(k+[s[i]for i in range(1,len(s))if s[i]!=s[i-1]])
 for i in range(1,len(s)):k+=[s[i]]*(3-2*(s[i]in'AEIOU'and i!=max(map(s.rfind,'AEIOU'))))
 return''.join(k)
print(' '.join(map(f,input().split())))

Pruébalo en línea!

Hiperneutrino
fuente
¿Puedes guardar bytes configurando va 'AEIOU'?
Zacharý
@ Zacharý Gracias, pero desafortunadamente no cambia el bytecount.
HyperNeutrino
Oh, los espacios alrededor del primero v.
Zacharý
0

Perl 5 , 139 + 1 (-p) = 140 bytes

$_=uc,s/^([^AEIOU]*)//,$s=$1,s/([^AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/ge,s/.*?\K([AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/e,print"$s$_ "for@F

Pruébalo en línea!

Incluso maneja el caso de prueba "aaaabbbbc" de acuerdo con el ejemplo.

Xcali
fuente