编写一个函数,该函数采用字母和空格字符串(无需处理非字母),并执行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
这是一个参考实现,除了今天早上该问题已经关闭之外,我将继续回答。:P
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('> '))