ANNNOUNNNCCCEEERRR VOICCCEEE

18

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, otherdeve se tornar, OTTTHHHEEERRRmas motherdeve se tornar MOTTTHHHEEERRR.
    • Alongar a vogal final, triplicando-a.
  • Nos dois casos de alongamento , se você está triplicando uma letra, primeiro combine-a com letras duplicadas em ambos os lados. Por exemplo, hilldeve se tornar HIIILLLe bookkeeperdeve se tornar BOOKKKEEPPPEEERRR.
  • Para os propósitos deste desafio, yconta 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('> '))
Quuxplusone
fonte
2
Uma solicitação para o futuro: evite palavras e frases como cluster consoante , coalescência e alongamento . Um falante não nativo de inglês como eu pode precisar de um dicionário para entender sua postagem.
Dennis
Deve ser as vogais que são "alongados" :(
Advogado do Diabo
O que é cluster consoante?
MilkyWay90

Respostas:

6

APL (Dyalog) , 175 bytes

1' +'R' ''[AEIOU][^AEIOU]+ 'R{m/⍨1,3×2≠/m←⍵.Match}'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'R'\1\1\1\2' '&' '&' '\1\1\1''$| |^'R'  '1(819⌶)⍞

Experimente online!

 prompt para entrada de caracteres

1(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 encontrado
  m← atribuir isso a m
  2≠/ par-wise diferente-de
   multiplicar por três
  1, preceder um
  m/⍨ 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)

Adão
fonte
Isto funciona? 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⌶)⍞
Zachary
^ Salva dois bytes se funcionar ^
Zacharý
5

JS (ES6), 138 134 129 bytes

s=>s.toUpperCase()[r="replace"](/(\w)\1/g,"$1")[r](/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s)[r](/\B./g,s=>/[AEIOU]/.test(s)?s:s+s+s)

WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Contém AEIOU3 vezes, mas não posso jogar em um.

-4 bytes graças ao HyperNeutrino

Ungolfed

function v(str){
    return str.toUpperCase().replace(/(\w)\1/g,"$1").replace(/[AEIOU](?=[^AEIOU]*( |$))/g,s=>s+s+s).replace(/\B./g,s=>[..."AEIOU"].includes(s)?s:s+s+s);
}

Eu gosto de escrever, não ler código.

ABot
fonte
1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... está em primeiro lugar, à frente da APL.
Zachary
Eu não sei JS, mas você pode substituir s=>/[AEIOU]/.test(s)por /[AEIOU]/.test?
procurando
@ musicman523 Infelizmente, não, porque é condicional em uma declaração de operador ternária.
Abot
Para sua informação, seu manuseio de clusters consoantes parece estar um pouco incorreto; a saída adequada seria WAAAYYY TOOO MAAANNNYYY BYTEEESSS(ou seja, não alongar o cluster inicial BYT).
Quuxplusone
Bem, estava em primeiro lugar.
Zacharý
5

APL, 90 bytes

{1↓∊{s←{⍵⊂⍨1,2≠/⍵}⋄x↑⍨¨(3⌈≢¨s⍵)⌊≢¨x←s⍵/⍨(1+2×{⌽<\⌽⍵}∨~∧∨\)⍵∊'AEIOU'}¨w⊂⍨w=⊃w←' ',1(819⌶)⍵}

Explicação:

  • 1(819⌶)⍵: converter para maiúsculas
  • w⊂⍨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.
      • : multiplique o vetor de bits por dois,
      • 1+: e adicione um. Agora todos os caracteres selecionados têm 3e o restante possui 1.
    • ⍵/⍨: replicar cada caractere em pela quantidade especificada
    • x←s: divida-o em cadeias de caracteres correspondentes e armazene-o em x .
    • (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 em x.
    • x↑⍨¨: faça com que cada grupo tenha esse comprimento
  • 1↓∊: achatar o resultado e soltar o primeiro caractere (o espaço que foi adicionado no início para ajudar na divisão)
marinus
fonte
Você venceu Adám ... uau.
Zacharý
muito arrumado! Se você embaralhar-lo um pouco e escrevê-lo como um programa (usando o prompt como sugerido por Adam), você pode raspar mais 15 bytes:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil
3

Python, 417 bytes

Aqui está uma implementação de referência em Python. Não é terrivelmente jogado.

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

Teste com:

while True:
 print a(raw_input('> '))
Quuxplusone
fonte
Você não deveria pelo menos jogar um pouco mais, removendo espaços desnecessários e mudando sspara S?
Zacharý 21/07
2

Python 3 , 238 bytes

def f(s):
 s=s.upper();k=[s[0]];s=''.join(k+[s[i]for i in range(1,len(s))if s[i]!=s[i-1]])
 for i in range(1,len(s)):k+=[s[i]]*(3-2*(s[i]in'AEIOU'and i!=max(map(s.rfind,'AEIOU'))))
 return''.join(k)
print(' '.join(map(f,input().split())))

Experimente online!

HyperNeutrino
fonte
Você pode salvar bytes configurando vpara 'AEIOU'?
Zachary
@ Zacharý Obrigado, mas infelizmente não altera o número de bytes.
HyperNeutrino
Oh, os espaços ao redor do primeiro v.
Zachary
0

Perl 5 , 139 + 1 (-p) = 140 bytes

$_=uc,s/^([^AEIOU]*)//,$s=$1,s/([^AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/ge,s/.*?\K([AEIOU])\1*/$1x(($q=length$&)>3?$q:3)/e,print"$s$_ "for@F

Experimente online!

Até lida com o caso de teste "aaaabbbbc" de acordo com o exemplo.

Xcali
fonte