เขียนฟังก์ชั่นที่ใช้สตริงของตัวอักษรและช่องว่าง (ไม่จำเป็นต้องจัดการกับตัวอักษรที่ไม่ใช่) และดำเนินการอัลกอริทึมการแปลเสียง ANNOUNCER ดังต่อไปนี้:
- ครั้งแรกทุกอย่างเป็นตัวพิมพ์ใหญ่
- สำหรับแต่ละคำ
- ยืดพยัญชนะแต่ละตัวโดยการเพิ่มตัวอักษรสามตัว; ยกเว้นถ้าคำขึ้นต้นด้วยกลุ่มพยัญชนะอย่ายืดออกคลัสเตอร์นั้น ยกตัวอย่างเช่น
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('> '))