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

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
  3× 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)


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.


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.
      • 2×: 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)

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

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!


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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.