É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,
other
devrait devenirOTTTHHHEEERRR
maismother
devrait devenirMOTTTHHHEEERRR
. - Allongez la voyelle finale en la triplant.
- 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,
- 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,
hill
devrait devenirHIIILLL
etbookkeeper
devrait devenirBOOKKKEEPPPEEERRR
. - Aux fins de ce défi,
y
compte 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('> '))
Réponses:
APL (Dyalog) , 175 octets
Essayez-le en ligne!
⍞
invite pour la saisie de caractères1(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 de3×
multiplier par trois,1,
préfixer unm/⍨
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)la source
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 octetsWAAAYYY TOOO MAAANNNYYY BYYYTTTEEESSS. Contient
AEIOU
3 fois, mais je ne peux pas les jouer en un seul.-4 octets grâce à HyperNeutrino
Non golfé
J'aime écrire, pas lire le code.
la source
s=>/[AEIOU]/.test(s)
par/[AEIOU]/.test
?WAAAYYY TOOO MAAANNNYYY BYTEEESSS
(c'est-à-dire ne pas allonger le cluster initialBYT
).APL, 90 octets
Explication:
1(819⌶)⍵
: convertir en majusculesw⊂⍨w=⊃w←' ',
: divisé sur des espaces{
...}¨
: pour chaque mot ...s←{⍵⊂⍨1,2≠/⍵}
:s
est 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 ont3
et les autres ont1
.⍵/⍨
: répliquez chaque caractère dans⍵
le montant indiquéx←s
: divisez-le en chaînes de caractères correspondants et stockez-le dansx
.(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 groupesx
.x↑⍨¨
: faites en sorte que chaque groupe ait cette longueur1↓∊
: aplatit le résultat et supprime le premier caractère (l'espace qui a été ajouté au début pour faciliter le fractionnement)la source
1↓∊{c/⍨(≢¨g)⌈3×((⌽<\∘⌽)∨~∧∨\)'AEIOU'∊⍨c←⊃¨g←⍵⊂⍨1,2≠/⍵}¨w⊂⍨w=⊃w←' ',1(819⌶)⍞
Python, 417 octets
Voici une implémentation de référence en Python. Pas terriblement golfé.
Testez avec:
la source
ss
pourS
?Python 3 , 238 octets
Essayez-le en ligne!
la source
v
sur'AEIOU'
?v
.Perl 5 , 139 + 1 (-p) = 140 octets
Essayez-le en ligne!
Gère même le cas de test "aaaabbbbc" conformément à l'exemple.
la source