Напишите функцию, которая принимает строку букв и пробелов (не нужно обрабатывать не-буквы) и выполняет алгоритм перевода ANNOUNCER VOICE следующим образом:
- Во-первых, все в верхнем регистре.
- Для каждого слова
- Удлините каждую группу согласных, утроив каждую букву; за исключением случаев, когда слово начинается с группы согласных, не удлиняйте эту группу. Например,
other
должен стать,OTTTHHHEEERRR
ноmother
должен статьMOTTTHHHEEERRR
. - Удлините последний гласный, утроив его.
- Удлините каждую группу согласных, утроив каждую букву; за исключением случаев, когда слово начинается с группы согласных, не удлиняйте эту группу. Например,
- В обоих случаях удлинения , если вы утроите букву, сначала объедините ее с дубликатами букв с обеих сторон. Например,
hill
должен статьHIIILLL
иbookkeeper
должен статьBOOKKKEEPPPEEERRR
. - Для целей этого вызова
y
считается согласной. - Уточнение / упрощение: Вы можете предположить, что каждая пара слов разделена одним пробелом и что входные данные не содержат последовательных пробелов и что входные данные не будут пустой строкой.
- Самый короткий код выигрывает!
Тестовые векторы:
> 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
Вот эталонная реализация, на которую я бы перешел к ответу, за исключением того, что с сегодняшнего утра вопрос закрыт. :П
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('> '))