ANNNOUNNNCCCEEERRR VOICCCEEE

18

Écrivez une fonction qui prend une chaîne de lettres et d'espaces (pas besoin de gérer les non-lettres) et exécute l'algorithme de traduction ANNOUNCER VOICE comme suit:

  • Tout d'abord, mettez tout en majuscules.
  • Pour chaque mot,
    • Allongez chaque groupe de consonnes en triplant chaque lettre; sauf que si le mot commence par un groupe de consonnes, ne pas allonger ce groupe. Par exemple, otherdevrait devenir OTTTHHHEEERRRmais motherdevrait devenir MOTTTHHHEEERRR.
    • Allongez la voyelle finale en la triplant.
  • Dans les deux cas d' allongement , si vous triplez une lettre, commencez par la fusionner avec des lettres en double de chaque côté. Par exemple, hilldevrait devenir HIIILLLet bookkeeperdevrait devenir BOOKKKEEPPPEEERRR.
  • Aux fins de ce défi, ycompte comme une consonne.
  • Clarification / simplification: vous pouvez supposer que chaque paire de mots est séparée par un seul espace, que l'entrée ne contient aucun espace consécutif et que l'entrée ne sera pas la chaîne vide.
  • Le code le plus court gagne!

Vecteurs de test:

> 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

Voici une implémentation de référence à laquelle je passerais à une réponse, sauf que depuis ce matin, la question est close. : 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
la source
2
Une demande pour l'avenir: veuillez éviter les mots et les expressions comme cluster de consonnes , fusion et allongement . Un anglophone non natif comme moi pourrait avoir besoin d'un dictionnaire pour comprendre votre message.
Dennis
Ce devraient être les voyelles qui sont "allongées" :(
Devil's Advocate
Qu'est-ce qu'un cluster consonantique?
MilkyWay90

Réponses:

6

APL (Dyalog) , 175 octets

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⌶)⍞

Essayez-le en ligne!

 invite pour la saisie de caractères

1(819⌶) convertir en majuscules (819 ≈ grand)

 passer le résultat plus loin (sert à séparer les cordes et le 1)

'$| |^'⎕R' 'R eplace:
 la fin, tout espace et le début
 → deux espaces

 passer le résultat plus loin (sert à séparer deux groupes de chaînes)

'([AEIOU])\1*([^AEIOU]*? )' ' [AEIOU]' ' [^ AEIOU]+' '([^AEIOU ])\1*'⎕R'\1\1\1\2' '&' '&' '\1\1\1'R eplace:
 un certain nombre de voyelles identiques et un certain nombre de non-voyelles et un espace
 → la triple voyelle et les consonnes non modifiées
 un espace et une voyelle
 → eux - mêmes
 un espace et un groupe consonantique
 → eux - mêmes
 une série de consonnes identiques
 → trois personnes les voyelles

'[AEIOU][^AEIOU]+ '⎕R{}R eplace:
 une série de non-voyelles et un espace
 → le résultat de la fonction anonyme suivante avec l'espace de noms comme argument:
  ⍵.Match le texte qui a été trouvé
  m← attribue cela à m
  2≠/ deux par deux, différent de
   multiplier par trois,
  1, préfixer un
  m/⍨ utiliser pour répliquerm

 passer le résultat plus loin (sert à séparer deux chaînes)

' +'⎕R' 'R eplace:
 un ou plusieurs espaces
 → avec un seul espace

1↓ déposez la lettre initiale (un espace)

Adam
la source
Est-ce que ça marche? 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⌶)⍞
Zacharý
^ Enregistre deux octets si cela fonctionne ^
Zacharý
5

JS (ES6), 138 134 129 octets

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. Contient AEIOU3 fois, mais je ne peux pas les jouer en un seul.

-4 octets grâce à HyperNeutrino

Non golfé

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);
}

J'aime écrire, pas lire le code.

ABot
la source
1
"WAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSSS" ... est en première position, devant APL.
Zacharý
Je ne connais pas JS, mais pouvez-vous remplacer s=>/[AEIOU]/.test(s)par /[AEIOU]/.test?
musicman523
@ musicman523 malheureusement, non, car c'est le conditionnel dans une déclaration d'opérateur ternaire.
ABu
Pour info, votre gestion des grappes de consonnes semble être légèrement incorrecte; la sortie appropriée serait WAAAYYY TOOO MAAANNNYYY BYTEEESSS(c'est-à-dire ne pas allonger le cluster initial BYT).
Quuxplusone
Eh bien, était en première place.
Zacharý
5

APL, 90 octets

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

Explication:

  • 1(819⌶)⍵: convertir en majuscules
  • w⊂⍨w=⊃w←' ',: divisé sur des espaces
  • {... : pour chaque mot ...
    • s←{⍵⊂⍨1,2≠/⍵}: sest une fonction qui divise une chaîne en groupes de caractères correspondants contigus
    • ⍵∊'AEIOU': marque les voyelles
    • (... ): voir quels caractères tripler
      • ~∧∨\: toutes les consonnes après la première voyelle,
      • {⌽<\⌽⍵}: la dernière voyelle.
      • : multipliez le vecteur de bits par deux,
      • 1+: et ajoutez-en un. Maintenant, tous les personnages sélectionnés ont 3et les autres ont 1.
    • ⍵/⍨: répliquez chaque caractère dans le montant indiqué
    • x←s: divisez-le en chaînes de caractères correspondants et stockez-le dans x.
    • (3⌈≢¨s⍵): la longueur de chaque groupe de caractères correspondants dans le mot d'entrée, avec un maximum de 3.
    • ⌊≢¨: le minimum et la durée des groupes x.
    • x↑⍨¨: faites en sorte que chaque groupe ait cette longueur
  • 1↓∊: aplatit le résultat et supprime le premier caractère (l'espace qui a été ajouté au début pour faciliter le fractionnement)
marinus
la source
Vous avez battu Adám ... wow.
Zacharý
très propre! Si vous le mélangez un peu et l'écrivez en tant que programme (en utilisant l'invite suggérée par Adám), vous pouvez raser 15 autres octets:1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Gil
3

Python, 417 octets

Voici une implémentation de référence en Python. Pas terriblement golfé.

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

Testez avec:

while True:
 print a(raw_input('> '))
Quuxplusone
la source
Ne devriez-vous pas au moins la jouer un peu plus loin en supprimant les espaces inutiles et en changeant sspour S?
Zacharý
2

Python 3 , 238 octets

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())))

Essayez-le en ligne!

HyperNeutrino
la source
Pouvez-vous enregistrer des octets en définissant vsur 'AEIOU'?
Zacharý
@ Zacharý Merci, mais malheureusement cela ne change pas le bytecount.
HyperNeutrino
Oh, les espaces autour du premier v.
Zacharý
0

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

$_=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

Essayez-le en ligne!

Gère même le cas de test "aaaabbbbc" conformément à l'exemple.

Xcali
la source