母音を一掃!


18

注:タイトルのスペルが意図的に間違っています。

文字列sが与えられた場合、2単語ごとに最初の母音を入れ替えます。この課題では、yは母音と見なされます。

たとえば、「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"

長さが異なる母音の連続音が存在する場合でも、連続音全体を交換します。単語に複数の母音が含まれている場合でも、最初の母音のみを入れ替えます。単語のペアの最初または2番目の単語に母音がない場合、それらの単語の母音を交換しません。

入力は、アルファベットの1つのケースとリテラルスペースまたは別の定数区切り文字のみで構成されていると想定できます。

I / Oの標準的な方法、標準的な抜け穴が適用されます。リード/トレーリングは何でも構いません。

テストケース:

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
削除された投稿を見ることができる人のために、サンドボックスの投稿はこちらにありました
同志SparklePony

1
最初の単語に母音がない場合、2番目と3番目の単語の母音を入れ替えてもかまいませんか?または、母音は2つの単語の実行間でのみ交換できますか?たとえば、すべきppcg is awesomeになりますppcg is awesomeppcg as iwesome
DJMcMayhem

@DJMcMayhem母音は、2つの単語の実行間でのみ交換できます。編集します。
同志SparklePony

母音は実行され、交換さthis is a long test case in case you could not tellれるため、の出力はになるはずです。this is o lang tast cese an cise ou cyould net tollyouou
内気なベルーガ

@BashfulBelugaうん、私の間違い。修正します。
同志SparklePony

回答:


9

V42、41のバイト

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

オンラインでお試しください!

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

説明:

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

これにより、次の例のように、2つの単語のすべてのグループが独自の行に配置されます。

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

次に、いくつかの派手な正規表現マジックを実行します。

Í                                           " 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

正規表現では、2つの母音グループの間に単語の終わりは必要ありません。 オンラインでお試しください!
nmjcman101

@ nmjcman101私の古いリビジョンを見ていますか?それがまさに私が今持っているものだからです
DJMcMayhem

私のTIOリンクは何も修正していませんでした。入力を変更しました。それは奇妙に文字を交換します。
nmjcman101

@ nmjcman101ああ、なるほど。今すぐ修正!
DJMcMayhem

6

Japt39 37バイト

彼らはそれはいだろうと言ったが、私は聞いていなかった...そしてそれは:

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

オンラインでテストしてください!

説明

 ¸  ò ® 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バイト

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


4

網膜、65バイト

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

オンラインでお試しください!テストケースが含まれています。条件付きグループ参照を使用したかったのですが、65バイト以下は言うまでもなく66バイトで動作させることができませんでした。


4

網膜、50バイト

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

オンラインでお試しください!

マーティンのおかげで-2バイト。

  • 最初のステップは、各単語ペアを独自の行に分割することです(改行です)。これにより.*、単語のペア内で使用できます。
  • 次に、各行について、各単語の最初の母音ブロックを見つけ、降順で位置ごとに並べ替えます。

ダブルを削除しようとしました[aeiouy]+が、経済的なものを取得できませんでした。
コビ

1
これは、ソート段階で実行を交換するためにわずかに短いです:tio.run/...
マーティン・エンダー

@MartinEnder-いいね!ソートを機能させることができませんでした。[aeiouy]重複を削除した別のバージョンを試してみましたが、ゴルフをダウンできません。あなたの提案でうまくいくかもしれないと思う:tio.run/…–
コビ

3

Python 2、148バイト

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

オンラインでお試しください!

コードゴルフはやみつきになります!

単語のペアからセクションを削除し、2つの母音グループとその間の文字列を取得し、順序を逆にして、それを代用として使用します。


3

ハスケル177の 173 171 169バイト

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)

オンラインでお試しください!

これは、次の単純なソリューションを直接短縮したものであるため、この辺りにもっと良いものがあるはずです。

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バイト

@KevinCruijssenのおかげで-34バイト

ゴルフ:

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

オンラインでお試しください!

ゴルフをしていない:

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
入力の前後の括弧を削除できます((l)->to l->)。import java.util.regex.*;バイトカウントに追加し、他のすべてを削除できjava.util.regex.ます。正規表現内の括弧を削除できます("([aeiouy]+)"-> "[aeiouy]+")。また、に変更してString[]s=l.split(" ");からString s[]=l.split(" "),a,b;Stringforループ内を削除できます。そして、あなたは変更することができますString.join(" ",s);l.join(" ",s);ここにすべてが組み合わされています。[ 329バイト ]
ケビンクルーッセン

@KevinCruijssen確かに!編集、ありがとう!:-)
内気なベルーガ



1

Pythonの3198の 196 192バイト

  • 6バイトの節約:Zachary Tのおかげで:if(m and n)mとnが正規表現文字列の不要なrを削除した場合、インデックスiは0ではなく1から始まります
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))

オンラインでお試しください!


1
プログラムから3バイト削ることができると思います。1つは文字列の前のrを削除し、もう1つはに変更i+1<len(a)i<=len(a)、3つ目をに変更if(m and n)if m and nます。
ザカリー

1
ありがとう。しかしi+1<len(a)に変更することはできませんi<=len(a)か、そうでなければ、評価しようとするa[j]つまりをa[i+1]するためにi=len(a)、原因のindex out of rangeエラー:
officialaimm

申し訳ありませんが、私はそのように読んでいたi<len(a)+1、おっとを!
ザカリー

1
これは機能しますか?repl.it/IlX1
ザカリー

1
行の最後に余分なスペースがあります。192バイトをカウントしました。
ザカリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.