Zamachaj samogłoskami!

18

Uwaga: tytuł został celowo wpisany błędnie.

Biorąc pod uwagę ciąg s, zamień pierwsze serie samogłosek co 2 słowa. W przypadku tego wyzwania y jest uważane za samogłoskę.

Na przykład, biorąc pod uwagę „wielki dzień pana”:

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"

Gdy istnieją przebiegi samogłosek o różnych długościach, nadal zamieniasz całe przebiegi. Kiedy słowo ma więcej niż jedną samogłoskę, nadal zamieniasz tylko pierwszą. Kiedy pierwsze lub drugie słowo pary słów nie ma samogłoski, nie zamieniasz samogłosek dla tych słów.

Możesz założyć, że dane wejściowe składają się tylko z jednej litery liter alfabetu i spacji dosłownej lub innego stałego separatora.

Obowiązują standardowe metody wejścia / wyjścia, standardowe luki. Wiodące / końcowe whatevers są w porządku.

Przypadki testowe:

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"
Towarzyszu SparklePony
źródło
1
Dla tych, którzy widzą usunięte posty, wpis piaskownicy był tutaj .
Towarzysz SparklePony,
1
Jeśli pierwsze słowo nie ma samogłosek, czy można zamienić samogłoski drugiego i trzeciego słowa? Czy też samogłoski mogą wymieniać tylko serie dwóch słów? Na przykład, powinny ppcg is awesomestać się ppcg is awesomealbo ppcg as iwesome?
DJMcMayhem
@DJMcMayhem Samogłoski mogą wymieniać tylko serie dwóch słów. Będę edytować.
Towarzysz SparklePony,
Uważam, że wynik this is a long test case in case you could not tellpowinien być this is o lang tast cese an cise ou cyould net toll, ponieważ samogłoska działa youi ouzostanie zamieniona.
Lękliwa Beluga,
@BashfulBeluga Tak, mój błąd. Naprawię.
Towarzysz SparklePony,

Odpowiedzi:

9

V , 42 , 41 bajtów

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

Wypróbuj online!

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                   ../......

Wyjaśnienie:

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

Spowoduje to umieszczenie wszystkich grup dwóch słów we własnej linii, na przykład:

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

Teraz wykonujemy fantazyjną magię wyrażeń regularnych:

Í                                           " 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
DJMcMayhem
źródło
Wyrażenie regularne nie wymaga końca słowa między dwiema grupami samogłosek. Wypróbuj online!
nmjcman101
@ nmjcman101 Czy patrzysz na moją starą wersję? Bo właśnie to mam teraz
DJMcMayhem
Moje łącze TIO niczego nie naprawiało, właśnie zmieniłem wejście. Dziwnie zamienia litery.
nmjcman101
@ nmjcman101 Ah, rozumiem. Naprawiono teraz!
DJMcMayhem
6

Japt , 39 lat 37 bajtów

Powiedzieli, że będzie brzydka, ale nie słuchałem ... a było to:

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

Przetestuj online!

Wyjaśnienie

 ¸  ò ® 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
ETHprodukcje
źródło
5

JavaScript (ES6), 62 106 98 101 bajtów

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

darrylyeo
źródło
4

Siatkówka , 65 bajtów

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

Wypróbuj online! Obejmuje przypadki testowe. Chciałem użyć warunkowego odwołania do grupy, ale nie mogłem zmusić go do działania w 66 bajtach, a tym bardziej w 65 lub mniej.

Neil
źródło
4

Siatkówka , 50 bajtów

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

Wypróbuj online!

-2 bajty dzięki Martinowi.

  • Pierwszym krokiem jest podzielenie każdej pary słów na własną linię ( jest to nowa linia). To pozwala nam korzystać.* kilku słów.
  • Następnie dla każdej linii znajdujemy pierwszy blok samogłosek w każdym słowie i sortujemy je według pozycji w kolejności malejącej.
Kobi
źródło
Próbowałem usunąć podwójne, [aeiouy]+ale nie mogłem uzyskać czegoś ekonomicznego.
Kobi
1
Jest niewiele
Martin Ender
@MartinEnder - Fajny! Nie mogłem dostać sortowania do pracy. Próbowałem innej wersji, która usunęła [aeiouy]duplikację, ale nie mogę jej pograć w golfa. Myślę, że może to ładnie działać z twoją sugestią: tio.run/…
Kobi
3

Python 2 , 148 bajtów

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

Wypróbuj online!

Code Golfing uzależnia się!

Sekcje składają się z par słów, a następnie chwytają 2 grupy samogłosek i ciąg znaków pomiędzy nimi, odwracają kolejność i wykorzystują je jako substytut .

Sunny Patel
źródło
3

Haskell , 177 173 171 169 bajtów

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)

Wypróbuj online!

Jest to bezpośrednie skrócenie następującego naiwnego rozwiązania, dlatego powinno być tutaj coś znacznie lepszego:

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)
bartavelle
źródło
2

Java (OpenJDK 8) ,363 304 + 25 bajtów

-34 bajty dzięki @KevinCruijssen

Gra w golfa:

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

Wypróbuj online!

Nie golfowany:

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);
}
Lękliwa Beluga
źródło
2
Możesz usunąć nawias wokół wejścia ( (l)->do l->). Możesz dodać import java.util.regex.*;do liczby bajtów i usunąć wszystkie inne java.util.regex.. Możesz usunąć nawias w wyrażeniu regularnym ( "([aeiouy]+)"-> "[aeiouy]+"). I możesz zmienić String[]s=l.split(" ");na String s[]=l.split(" "),a,b;, a następnie możesz usunąć Stringwnętrze pętli for; I możesz zmienić String.join(" ",s);na l.join(" ",s);. Oto wszystko połączone. [ 329 bajtów ]
Kevin Cruijssen
@KevinCruijssen Rzeczywiście! Edytowane, dziękuję! :-)
Bashful Beluga
2

Perl, 58 bajtów

Kod 57 bajtów + 1 dla -p.

$v="([aeiouy]+)";s!\w+ \w+!$&=~s/$v(.* .*?)$v/$3$2$1/r!ge

-2 bajty dzięki @Dada !

Wypróbuj online!

Dom Hastings
źródło
Wystarczy kilka bajtów, aby zaoszczędzić, upuszczając ?i zapisując ([aeiouy]+)w zmiennej: Wypróbuj online!
Dada
1

Rubinowy, 87 + 1 = 88 bajtów

Używa -pflagi.

gsub(/(\w+) (\w+)/){_,a,b=*$~;a[r=/[aeiouy]+/]&&b[r]?a.sub(r,b[r])+' '+b.sub(r,a[r]):_}

Wypróbuj online!

Wartość tuszu
źródło
1

Python 3 , 198 196 192 bajtów

  • Zapisano 6 bajtów: dzięki Zachary'emu T : if(m and n)aby if i n usunęły niechciane r dla ciągu regularnego, indeks i zaczynając od 1 zamiast 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))

Wypróbuj online!

Officialaimm
źródło
1
Myślę, że możesz ogolić trzy bajty ze swojego programu: jeden przez usunięcie r przed łańcuchem, inny przez zmianę i+1<len(a)na i<=len(a), a trzeci przez zmianę if(m and n)na if m and n.
Zacharý
1
Dzięki. Ale i+1<len(a)nie można zmienić na, i<=len(a)inaczej spróbuje ocenić, a[j]tj. a[i+1]Za i=len(a)i spowoduje index out of rangebłąd:
officialaimm
Przepraszam, czytałem to jako i<len(a)+1, ups!
Zacharý
1
Czy to zadziała? repl.it/IlX1
Zacharý
1
Na końcu niektórych linii masz obce spacje, naliczyłem 192 bajty.
Zacharý