Balayez les voyelles!


18

Remarque: le titre a été mal orthographié intentionnellement.

Étant donné une chaîne s, permutez les premières voyelles de tous les 2 mots. Pour ce défi, y est considéré comme une voyelle.

Par exemple, étant donné une entrée de "grand jour monsieur":

1. Input: "great day sir"
2. Identify pairs of words: "[great day] [sir]" (No word for sir to pair with)
3. Identify the first vowel runs in each word: "[gr[ea]t d[ay]] [s[i]r]"
4. Swap the vowel runs in each pair: "[gr[ay]t d[ea]] [s[i]r]"
5. Return/print: "grayt dea sir"

Lorsqu'il y a des pistes de voyelles de différentes longueurs, vous permutez toujours toutes les pistes. Lorsqu'un mot comporte plus d'une voyelle, vous n'échangez toujours que le premier. Lorsque le premier ou le deuxième mot d'une paire de mots n'a pas de voyelle, vous n'échangez pas les voyelles pour ces mots.

Vous pouvez supposer que l'entrée se compose uniquement d'un cas de lettres alphabétiques et de l'espace littéral ou d'un autre délimiteur constant.

Les méthodes standard d'E / S, les échappatoires standard s'appliquent. Les whatsvers de tête / arrière sont corrects.

Cas de test:

Input -> Output

"great day sir" -> "grayt dea sir"
"ppcg is the best" -> "ppcg is the best" (When there is no vowel to swap, don't swap vowels."
"this is a test case" -> "this is e tast case"
"loooooooooooooong word" -> "long woooooooooooooord"
"great night" -> "grit neaght"
"anything goes" -> "oenything gas"
"qwrtpsdfghjklzxcvbnm aaaaaaaa hi there" -> "qwrtpsdfghjklzxcvbnm aaaaaaaa he thire"
"this is a long test case in case you could not tell" -> "this is o lang tast cese an cise ou cyould net toll"

1
Pour ceux qui peuvent voir les messages supprimés, le message sandbox était ici .
Camarade SparklePony

1
Si le premier mot n'a pas de voyelles, est-il correct d'échanger les voyelles des deuxième et troisième mots? Ou les voyelles peuvent-elles seulement s'échanger entre deux séries de mots? Par exemple, devrait ppcg is awesomedevenir ppcg is awesomeou ppcg as iwesome?
DJMcMayhem

@DJMcMayhem Les voyelles ne peuvent qu'échanger entre deux séries de mots. Je vais éditer.
Camarade SparklePony

Je crois que la sortie de this is a long test case in case you could not telldevrait être this is o lang tast cese an cise ou cyould net toll, car la voyelle fonctionne youet ouserait échangée.
Bashful Beluga

@BashfulBeluga Yep, mon erreur. Je vais réparer.
Camarade SparklePony

Réponses:


9

V , 42 , 41 octets

ò2Eá
òͨ[aeiouy]«©¨ƒ ƒ©¨[aeiouy]«©/³²±
Íî

Essayez-le en ligne!

Hexdump:

00000000: f232 45e1 0af2 cda8 5b61 6569 6f75 795d  .2E.....[aeiouy]
00000010: aba9 a883 2083 a9a8 5b61 6569 6f75 795d  .... ...[aeiouy]
00000020: aba9 2fb3 b2b1 0acd ee                   ../......

Explication:

ò       ò                                   " Recursively:
 2E                                         "   Move to the end of two words forward
   á<cr>                                    "   And append a newline

Cela mettra tous les groupes de deux mots sur leur propre ligne, par exemple:

this is
a long
test case
in case
you could
not tell

Maintenant, nous exécutons une magie regex fantaisie:

Í                                           " Globally substitute
 ¨[aeiouy]«©                                "   A vowel (capture group 1)
            ¨<131>                          "   Followed by as few characters as possible, then a space
                   <131>©                   "   Followed by as few characters as possible (capture group 2)
                         ¨[aeiouy]«©        "   Followed by a vowel again
                                    /       " With:
                                     ³²±    "   Capture groups '3', '2', '1'
Í                                           " Remove all:
 î                                          "   Newlines

Votre expression régulière ne nécessite pas la fin d'un mot entre vos deux groupes de voyelles. Essayez-le en ligne!
nmjcman101

@ nmjcman101 Regardez-vous mon ancienne révision? Parce que c'est exactement ce que j'ai en ce moment
DJMcMayhem

Mon lien TIO ne réparait rien, je viens de changer l'entrée. Il échange étrangement les lettres.
nmjcman101

@ nmjcman101 Ah, je vois. Fixé maintenant!
DJMcMayhem

6

Japt , 39 37 octets

Ils ont dit que ce serait moche, mais je n'ai pas écouté ... et c'était:

¸ò ®efQ="%y+" ?Z£XrQZg°T fQP PÃ:ZÃc ¸

Testez-le en ligne!

Explication

 ¸  ò ® efQ="%y+" ?Z£    XrQ    Zg° T fQ    P PÃ :ZÃ c ¸
UqS ò mZ{Zef"%y+" ?ZmXYZ{Xr"%y+"Zg++T f"%y+"P P} :Z} c qS
             Implicit: U = input string, such as     "abc def ghi jkl mno"
UqS          Split on spaces, splitting into words.  ["abc","def","ghi","jkl","mno"]
ò            Group into runs of two items.           [["abc","def"],["ghi","jkl"],["mno"]]
mZ{          For each pair Z:
 Zef"%y+"?     If not every item contains a run of vowels (%y = [AEIOUYaeiouy]),
 :Z            return Z.                             [              ["ghi","jkl"]        ]
 ZmXYZ{        Otherwise, for each item X in Z:
  Xr"%y+"        Replace each run of vowels with
  Zg++T           the item at the next index in Z,   [["def","abc"]               ["mno"]]
  f"%y+"P         but only the first run of vowels.  [["e",  "a"  ]               ["o"  ]]
  P              Replace only for the first match.   [["ebc","daf"]               ["mno"]]
 }
}                                                    [["ebc","daf"],["ghi","jkl"],"mno"]]
c            Flatten back into a single array.       ["ebc","def","ghi","jkl","mno"]
qS           Re-join on spaces.                      "ebc daf ghi jkl mno"
             Implicit: output result of last expression

5

JavaScript (ES6), 62 106 98 101 octets

s=>s.match(/(\w+)( (\w+))?/g).map(m=>m.replace(/([aeiouy]+)(\w* \w*?)([aeiouy]+)/g,'$3$2$1')).join` `


4

Rétine , 65 octets

((\w*?)([aeiouy]+)(\w* \w*?)([aeiouy]+)|(\w+ ))(\w*)
$2$5$4$3$6$7

Essayez-le en ligne! Comprend des cas de test. Je voulais utiliser une référence de groupe conditionnelle mais je ne pouvais pas la faire fonctionner en 66 octets et encore moins 65 ou moins.


4

Rétine , 50 octets

\S+ \S+ 
$&¶
%O$^`(?<=\b[^aeiouy]*)[aeiouy]+
$`
¶

Essayez-le en ligne!

−2 octets grâce à Martin.

  • La première étape consiste à diviser chaque paire de mots en sa propre ligne ( c'est la nouvelle ligne). Cela nous permet d'utiliser .*dans une paire de mots.
  • Ensuite, pour chaque ligne, nous trouvons le premier bloc de voyelle dans chaque mot et les trions par position dans l'ordre décroissant.

J'ai essayé de supprimer le double [aeiouy]+mais je n'ai pas pu obtenir quelque chose d'économique.
Kobi

1
Il est légèrement plus court d'échanger les pistes avec une étape de tri: tio.run/…
Martin Ender

@MartinEnder - Nice one! Je n'arrivais pas à faire le tri. J'ai essayé une autre version qui a supprimé la [aeiouy]duplication, mais je ne peux pas la jouer. Je pense que cela pourrait bien fonctionner avec votre suggestion: tio.run/…
Kobi

3

Python 2 , 148 octets

from re import*
v="([aeiouy]+)"
print sub(r"(\w+)(?: (\w+))?",lambda m:sub(v+"(.* .*?)"+v,lambda g:''.join(g.groups()[::-1]),m.group()),raw_input())

Essayez-le en ligne!

Le golf de code devient addictif!

Coupe des paires de mots, puis saisit les 2 groupes de voyelles et la chaîne entre les deux, inverse l'ordre et l'utilise comme substitut .


3

Haskell , 177 173 171 169 169 octets

unwords.s.words
s(x:y:z)=maybe[x,y]id(do(a,b)<-k x;(c,d)<-k y;j[b c,d a])++s z
s x=x
v=(`elem`"aeiouy")
j=Just
k s=do(a,(x:y,r))<-j$span v<$>break v s;j(x:y,\n->a++n++r)

Essayez-le en ligne!

Il s'agit d'un raccourcissement direct de la solution naïve suivante, il devrait donc y avoir quelque chose de bien mieux ici:

swapvowels :: String -> String
swapvowels = unwords . swapPairs . words

swapPairs :: [String] -> [String]
swapPairs (word1:word2:rest) =
   case (,) <$> extractVowels word1 <*> extractVowels word2 of
     Just ((vowels1, rebuild1), (vowels2, rebuild2))
       -> [rebuild1 vowels2, rebuild2 vowels1] ++ swapPairs rest
     Nothing -> [word1,word2] ++ swapPairs rest
swapPairs rest = rest

extractVowels :: String -> Maybe (String, String -> String)
extractVowels s = do
    let isVowel l = l `elem` "aeiouy"
    (a,b) <- Just $ break isVowel s 
    (w@(_:_),r) <- Just $ span isVowel b 
    return (w, \n -> a ++ n ++ r)

2

Java (OpenJDK 8) ,363 304 + 25 octets

-34 octets grâce à @KevinCruijssen

Golfé:

l->{String s[]=l.split(" "),a,b;Pattern p=Pattern.compile("[aeiouy]+");for(int i=0;i<s.length-1;i+=2){Matcher m=p.matcher(s[i]),n=p.matcher(s[i+1]);a=m.find()?m.group():null;b=n.find()?n.group():null;if(a!=null&b!=null){s[i]=s[i].replaceFirst(a,b);s[i+1]=s[i+1].replaceFirst(b,a);}}return l.join(" ",s);}

Essayez-le en ligne!

Non golfé:

String swapVowels(String line) {
    String[] parts = line.split(" ");
    Pattern pattern = Pattern.compile("([aeiouy]+)");
    for (int i = 0; i < parts.length - 1; i += 2) {
        Matcher matcherL = pattern.matcher(parts[i]), matcherR = pattern.matcher(parts[i + 1]);
        String vowelRunL = matcherL.find() ? matcherL.group() : null, vowelRunR = matcherR.find() ? matcherR.group() : null;
        if (vowelRunL != null & vowelRunR != null) {
            parts[i] = parts[i].replaceFirst(vowelRunL, vowelRunR);
            parts[i + 1] = parts[i + 1].replaceFirst(vowelRunR, vowelRunL);
        }
    }
    return String.join(" ", parts);
}

2
Vous pouvez supprimer les parenthèses autour de l'entrée ( (l)->à l->). Vous pouvez ajouter import java.util.regex.*;au nombre d'octets et supprimer tous les autres java.util.regex.. Vous pouvez supprimer les parenthèses dans l'expression régulière ( "([aeiouy]+)"-> "[aeiouy]+"). Et vous pouvez passer String[]s=l.split(" ");à String s[]=l.split(" "),a,b;, puis vous pouvez supprimer l' Stringintérieur de la boucle for; Et vous pouvez changer String.join(" ",s);pour l.join(" ",s);. Voici tout cela combiné. [ 329 octets ]
Kevin Cruijssen

@KevinCruijssen Effectivement! Modifié, merci! :-)
Bashful Beluga



1

Python 3 , 198 196 192 192 octets

  • 6 octets sauvegardés: grâce à Zachary T : if(m and n)si m et n & ont supprimé r indésirable pour la chaîne d'expression régulière, index i à partir de 1 au lieu de 0
from re import*
s=search
a=input().split()
v="[aeiouy]+"
j=1
while j<len(a):
 i=j-1;m=s(v,a[j]);n=s(v,a[i])
 if m and n:a[i]=sub(v,m[0],a[i],1);a[j]=sub(v,n[0],a[j],1)
 j+=2
print(' '.join(a))

Essayez-le en ligne!


1
Je pense que vous pouvez raser trois octets de votre programme: un en supprimant le r avant votre chaîne, un autre en changeant i+1<len(a)en i<=len(a), et le troisième en changeant if(m and n)en if m and n.
Zacharý

1
Merci. Mais i+1<len(a)ne peut pas être changé pour i<=len(a)ou bien il va essayer d'évaluer par a[j]exemple a[i+1]pour i=len(a)et provoquer une index out of rangeerreur:
officialaimm

Désolé, je lisais ça comme i<len(a)+1, oups!
Zacharý

1
Est-ce que cela fonctionnerait? repl.it/IlX1
Zacharý

1
Vous avez des espaces superflus à la fin de certaines de vos lignes, j'ai compté 192 octets.
Zacharý
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.