Escreva uma função que utilize uma sequência de letras e espaços (sem necessidade de manipular não letras) e execute o algoritmo de tradução ANUNUNCER VOICE da seguinte maneira:
- Primeiro, coloque tudo em maiúsculas.
- Para cada palavra,
- Alongar cada cluster consoante triplicando cada letra; exceto, se a palavra começar com um cluster consoante, não o alonge. Por exemplo,
other
deve se tornar,OTTTHHHEEERRR
masmother
deve se tornarMOTTTHHHEEERRR
. - Alongar a vogal final, triplicando-a.
- Alongar cada cluster consoante triplicando cada letra; exceto, se a palavra começar com um cluster consoante, não o alonge. Por exemplo,
- Nos dois casos de alongamento , se você está triplicando uma letra, primeiro combine-a com letras duplicadas em ambos os lados. Por exemplo,
hill
deve se tornarHIIILLL
ebookkeeper
deve se tornarBOOKKKEEPPPEEERRR
. - Para os propósitos deste desafio,
y
conta como uma consoante. - Esclarecimento / simplificação: Você pode assumir que cada par de palavras está separado por um único espaço e que a entrada não contém espaços consecutivos e que a entrada não será a sequência vazia.
- O código mais curto vence!
Vetores de teste:
> 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
Aqui está uma implementação de referência que eu gostaria de responder, exceto que a partir desta manhã a pergunta foi encerrada. : 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('> '))
Respostas:
APL (Dyalog) , 175 bytes
Experimente online!
⍞
prompt para entrada de caracteres1(819⌶)
converter para maiúsculas (819 ≈ Grande)⊢
passar o resultado ainda mais (serve para separar as cordas e o 1)'$| |^'⎕R' '
R moran Jr.:o fim, qualquer espaço, eo início
→ dois espaços
⊢
passar o resultado ainda mais (serve para separar dois grupos de strings)'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'
R moran Jr.:qualquer número de vogais idênticas e qualquer número de não vogais e um espaço
→ a três vezes vogal e as consoantes não modificados
um espaço e uma vogal
→-se
um espaço e um cluster consoante
→-se
uma corrida de consoantes idênticas
→ três daqueles vogais
'[AEIOU][^AEIOU]+ '⎕R{
...}
R moran Jr.:uma série de não-vogais e um espaço
→ o resultado da seguinte função anônima com o namespace
⍵
como argumento:⍵.Match
o texto que foi encontradom←
atribuir isso am
2≠/
par-wise diferente-de3×
multiplicar por três1,
preceder umm/⍨
uso que, para replicarm
⊢
passar o resultado ainda mais (serve para separar duas strings)' +'⎕R' '
R moran Jr.:um ou mais espaços
→ com um único espaço
1↓
solte a letra inicial (um espaço)fonte
1↓' +'⎕R' '⊢'[AEIOU][^AEIOU]+ '⎕R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R(s,'\2')'&' '&'(s←6⍴'\1')⊢'$| |^'⎕R' '⊢1(819⌶)⍞
JS (ES6),
138134129 bytesWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Contém
AEIOU
3 vezes, mas não posso jogar em um.-4 bytes graças ao HyperNeutrino
Ungolfed
Eu gosto de escrever, não ler código.
fonte
s=>/[AEIOU]/.test(s)
por/[AEIOU]/.test
?WAAAYYY TOOO MAAANNNYYY BYTEEESSS
(ou seja, não alongar o cluster inicialBYT
).APL, 90 bytes
Explicação:
1(819⌶)⍵
: converter para maiúsculasw⊂⍨w=⊃w←' ',
: dividir em espaços{
...}¨
: para cada palavra ...s←{⍵⊂⍨1,2≠/⍵}
:s
é uma função que divide uma sequência em grupos de caracteres correspondentes contíguos⍵∊'AEIOU'
: marcar as vogais(
...)
: veja quais caracteres triplicar~∧∨\
: todas as consoantes após a primeira vogal,{⌽<\⌽⍵}
: a última vogal.2×
: multiplique o vetor de bits por dois,1+
: e adicione um. Agora todos os caracteres selecionados têm3
e o restante possui1
.⍵/⍨
: replicar cada caractere em⍵
pela quantidade especificadax←s
: divida-o em cadeias de caracteres correspondentes e armazene-o emx
.(3⌈≢¨s⍵)
: o comprimento de cada grupo de caracteres correspondentes na palavra de entrada, com no máximo 3.⌊≢¨
: o mínimo disso e os comprimentos dos grupos emx
.x↑⍨¨
: faça com que cada grupo tenha esse comprimento1↓∊
: achatar o resultado e soltar o primeiro caractere (o espaço que foi adicionado no início para ajudar na divisão)fonte
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Python, 417 bytes
Aqui está uma implementação de referência em Python. Não é terrivelmente jogado.
Teste com:
fonte
ss
paraS
?Python 3 , 238 bytes
Experimente online!
fonte
v
para'AEIOU'
?v
.Perl 5 , 139 + 1 (-p) = 140 bytes
Experimente online!
Até lida com o caso de teste "aaaabbbbc" de acordo com o exemplo.
fonte