文字とスペースの文字列(非文字を処理する必要はありません)を受け取り、次のように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('> '))