Viết hàm lấy một chuỗi các chữ cái và dấu cách (không cần xử lý các chữ cái không) và thực hiện thuật toán dịch ANNOUNCER VOICE như sau:
- Đầu tiên, viết hoa mọi thứ.
- Đối với mỗi từ,
- Kéo dài từng cụm phụ âm bằng cách nhân ba chữ cái; ngoại trừ, nếu từ bắt đầu bằng cụm phụ âm, không kéo dài cụm đó. Ví dụ,
other
nên trở thànhOTTTHHHEEERRR
nhưngmother
nên trở thànhMOTTTHHHEEERRR
. - Kéo dài nguyên âm cuối cùng bằng cách tăng gấp ba lần.
- Kéo dài từng cụm phụ âm bằng cách nhân ba chữ cái; ngoại trừ, nếu từ bắt đầu bằng cụm phụ âm, không kéo dài cụm đó. Ví dụ,
- Trong cả hai trường hợp kéo dài , nếu bạn tăng gấp ba chữ cái, trước tiên hãy kết hợp nó với các chữ cái trùng lặp ở hai bên. Ví dụ,
hill
nên trở thànhHIIILLL
vàbookkeeper
nên trở thànhBOOKKKEEPPPEEERRR
. - Đối với mục đích của thử thách này,
y
được tính là một phụ âm. - Làm rõ / đơn giản hóa: Bạn có thể giả sử rằng mỗi cặp từ được phân tách bằng một khoảng trắng và đầu vào không chứa khoảng trắng liên tiếp và đầu vào sẽ không phải là chuỗi trống.
- Mã ngắn nhất sẽ thắng!
Các vectơ kiểm tra:
> 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
Đây là một triển khai tham chiếu mà tôi sẽ chuyển đến một câu trả lời ngoại trừ vào sáng nay câu hỏi đã được đóng lại. : 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('> '))