Fegen Sie die Vokale!

18

Hinweis: Der Titel wurde absichtlich falsch geschrieben.

Tauschen Sie bei einer gegebenen Zeichenfolge s die ersten Vokalläufe von jeweils 2 Wörtern aus. Für diese Herausforderung wird y als Vokal betrachtet.

Zum Beispiel bei einer Eingabe von "great day sir":

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"

Wenn es Vokalläufe unterschiedlicher Länge gibt, tauschen Sie trotzdem die gesamten Läufe aus. Wenn ein Wort mehr als einen Vokal hat, tauschen Sie immer noch nur den ersten. Wenn das erste oder zweite Wort eines Wortpaares keinen Vokal enthält, tauschen Sie die Vokale nicht gegen diese Wörter aus.

Sie können davon ausgehen, dass die Eingabe nur aus einem Buchstaben und dem Literalraum oder einem anderen konstanten Trennzeichen besteht.

Standardmethoden für E / A, es gelten Standardlücken. Führende / nachfolgende Whatever sind in Ordnung.

Testfälle:

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"
Genosse SparklePony
quelle
1
Für diejenigen, die gelöschte Beiträge sehen können, war der Sandbox-Beitrag hier .
Genosse SparklePony
1
Wenn das erste Wort keine Vokale hat, ist es in Ordnung, die Vokale des zweiten und dritten Wortes zu vertauschen? Oder können Vokale nur zwischen zwei Wörtern wechseln? Soll zum Beispiel ppcg is awesomewerden ppcg is awesomeoder ppcg as iwesome?
DJMcMayhem
@DJMcMayhem Vokale können nur zwischen Läufen von zwei Wörtern wechseln. Ich werde bearbeiten.
Genosse SparklePony
Ich glaube die Ausgabe für this is a long test case in case you could not tellsollte sein this is o lang tast cese an cise ou cyould net toll, da der Vokal läuft youund ougetauscht werden würde.
Bashful Beluga
@BashfulBeluga Ja, mein Fehler. Ich werde reparieren.
Genosse SparklePony

Antworten:

9

V , 42 , 41 Bytes

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

Probieren Sie es 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                   ../......

Erläuterung:

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

Dies setzt alle Gruppen von zwei Wörtern in eine eigene Zeile, zum Beispiel:

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

Jetzt führen wir eine ausgefallene Regex-Magie aus:

Í                                           " 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
quelle
Ihr regulärer Ausdruck erfordert nicht das Ende eines Wortes zwischen Ihren beiden Vokalgruppen. Probieren Sie es online!
nmjcman101
@ nmjcman101 Siehst du meine alte Revision an? Denn genau das habe ich gerade
DJMcMayhem
Mein TIO-Link hat nichts repariert, ich habe nur die Eingabe geändert. Es tauscht die Buchstaben seltsamerweise.
nmjcman101
@ nmjcman101 Ah, ich verstehe. Jetzt behoben!
DJMcMayhem
6

Japt , 39 37 Bytes

Sie sagten, es wäre hässlich, aber ich hörte nicht zu ... und es war:

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

Online testen!

Erläuterung

 ¸  ò ® 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
ETHproductions
quelle
5

JavaScript (ES6), 62 106 98 101 Byte

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

darrylyeo
quelle
4

Netzhaut , 65 Bytes

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

Probieren Sie es online! Beinhaltet Testfälle. Ich wollte eine bedingte Gruppenreferenz verwenden, aber ich konnte sie nicht in 66 Bytes oder gar 65 oder weniger zum Laufen bringen.

Neil
quelle
4

Netzhaut , 50 Bytes

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

Probieren Sie es online!

−2 Bytes dank Martin.

  • Der erste Schritt besteht darin, jedes Wortpaar in eine eigene Zeile aufzuteilen ( aufzuteilen ist Newline). Dies ermöglicht es uns, .*innerhalb eines Paares von Wörtern zu verwenden.
  • Als nächstes finden wir für jede Zeile den ersten Vokalblock in jedem Wort und sortieren sie nach Position in absteigender Reihenfolge.
Kobi
quelle
Ich habe versucht, das Doppel zu entfernen [aeiouy]+, konnte aber nicht wirtschaftlich werden.
Kobi
1
Es ist geringfügig kürzer, die Läufe mit einer Sortierstufe zu tauschen: tio.run/…
Martin Ender
@MartinEnder - Schön! Ich konnte das Sortieren nicht zum Laufen bringen. Ich habe eine andere Version ausprobiert, die die [aeiouy]Duplizierung entfernt hat, aber ich kann nicht Golf spielen. Ich denke, es könnte gut mit Ihrem Vorschlag funktionieren
Kobi
3

Python 2 , 148 Bytes

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

Probieren Sie es online!

Code Golf macht süchtig!

Schneidet Paare von Wörtern ab, greift dann nach den 2 Gruppen von Vokalen und der dazwischen liegenden Zeichenkette, kehrt die Reihenfolge um und verwendet diese als Ersatz .

Sonniges Patel
quelle
3

Haskell , 177 173 171 169 Bytes

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)

Probieren Sie es online!

Dies ist eine direkte Verkürzung der folgenden naiven Lösung, daher sollte es hier etwas Besseres geben:

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
quelle
2

Java (OpenJDK 8) ,363 304 + 25 Bytes

-34 Bytes dank @KevinCruijssen

Golf gespielt:

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

Probieren Sie es online!

Ungolfed:

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);
}
Schüchterner Beluga
quelle
2
Sie können die Klammer um die Eingabe ( (l)->bis l->) entfernen . Sie können import java.util.regex.*;die Byteanzahl erhöhen und alle anderen entfernen java.util.regex.. Sie können die Klammer im regulären Ausdruck ( "([aeiouy]+)"-> "[aeiouy]+") entfernen . Und Sie können sich ändern String[]s=l.split(" ");zu String s[]=l.split(" "),a,b;, dann können Sie das Entfernen Stringinnerhalb der for-Schleife; Und Sie können sich ändern String.join(" ",s);zu l.join(" ",s);. Hier ist alles vereint. [ 329 bytes ]
Kevin Cruijssen
@ KevinCruijssen In der Tat! Bearbeitet, danke! :-)
Bashful Beluga
1

Ruby, 87 + 1 = 88 Bytes

Verwendet die -pFlagge.

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

Probieren Sie es online!

Wert Tinte
quelle
1

Python 3 , 198 196 192 Bytes

  • 6 Bytes gespart: dank Zachary T : if(m and n)Wenn m und n & unerwünschte r für Regex-Zeichenfolge entfernt, Index i beginnend mit 1 anstelle von 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))

Probieren Sie es online!

officialaimm
quelle
1
Ich glaube , Sie drei Bytes aus Ihrem Programm rasieren können: ein durch die r vor der Zeichenfolge zu entfernen, einen anderen durch Änderung i+1<len(a)zu i<=len(a), und der dritter durch eine Änderung if(m and n)an if m and n.
Zacharý
1
Vielen Dank. Aber die i+1<len(a)kann nicht geändert werden, i<=len(a)oder es wird versucht zu bewerten, a[j]dh a[i+1]für i=len(a)und index out of rangeFehler verursachen :
officialaimm
Entschuldigung, ich habe das so gelesen i<len(a)+1, whoops!
Zacharý
1
Würde das funktionieren? repl.it/IlX1
Zacharý
1
Sie haben Leerzeichen am Ende einiger Ihrer Zeilen, ich habe 192 Bytes gezählt.
Zacharý