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,
other
debería convertirseOTTTHHHEEERRR
peromother
deberí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,
hill
debería convertirseHIIILLL
ybookkeeper
debería convertirseBOOKKKEEPPPEEERRR
. - Para los propósitos de este desafío,
y
cuenta 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:⍵.Match
el texto que se encontróm←
asigna eso param
2≠/
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
AEIOU
3 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≠/⍵}
: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.2×
: multiplica el vector de bits por dos,1+
: y agrega uno. Ahora todos los personajes seleccionados tienen3
y 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
ss
aS
?Python 3 , 238 bytes
Pruébalo en línea!
fuente
v
a'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