Scrivi una funzione che accetta una stringa di lettere e spazi (non è necessario gestire non lettere) ed esegue l'algoritmo di traduzione VOCALE ANNOUNCER come segue:
- Innanzitutto, tutto in maiuscolo.
- Per ogni parola,
- Allunga ogni gruppo di consonanti triplicando ogni lettera; tranne, se la parola inizia con un gruppo di consonanti, non allungare quel gruppo. Ad esempio,
otherdovrebbe diventareOTTTHHHEEERRRmamotherdovrebbe diventareMOTTTHHHEEERRR. - Allunga la vocale finale triplicandola.
- Allunga ogni gruppo di consonanti triplicando ogni lettera; tranne, se la parola inizia con un gruppo di consonanti, non allungare quel gruppo. Ad esempio,
- In entrambi i casi di allungamento , se stai triplicando una lettera, prima mescola con lettere duplicate su entrambi i lati. Ad esempio,
hilldovrebbe diventareHIIILLLebookkeeperdovrebbe diventareBOOKKKEEPPPEEERRR. - Ai fini di questa sfida,
yconta come consonante. - Chiarimento / semplificazione: è possibile supporre che ogni coppia di parole sia separata da un singolo spazio e che l'input non contenga spazi consecutivi e che l'input non sia la stringa vuota.
- Vince il codice più corto!
Vettori di prova:
> 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
Ecco un'implementazione di riferimento che vorrei passare a una risposta, tranne che da stamattina la domanda è stata chiusa. : 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('> '))