Sapu vokal!


18

Catatan: judul itu salah eja secara sengaja.

Diberikan string s, swap aliran vokal pertama dari setiap 2 kata. Untuk tantangan ini, Anda dianggap sebagai vokal.

Misalnya, diberi masukan "hari yang menyenangkan":

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"

Ketika ada aliran vokal dengan panjang berbeda, Anda masih menukar seluruh aliran. Ketika sebuah kata memiliki lebih dari satu vokal berjalan, Anda masih hanya menukar yang pertama. Ketika kata pertama atau kedua dari sepasang kata tidak memiliki vokal, maka Anda tidak menukar vokal dengan kata-kata itu.

Anda dapat mengasumsikan bahwa input hanya terdiri dari satu huruf alfabet dan spasi literal atau pembatas konstan lainnya.

Metode standar I / O, celah standar berlaku. Whatevers terkemuka / tertinggal tidak apa-apa.

Kasus uji:

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
Bagi mereka yang dapat melihat posting yang dihapus, posting sandbox ada di sini .
Kamerad SparklePony

1
Jika kata pertama tidak memiliki vokal, apakah boleh menukar vokal dari kata kedua dan ketiga? Atau bisakah vokal hanya bertukar antara dua kata? Misalnya, harus ppcg is awesomemenjadi ppcg is awesomeatau ppcg as iwesome?
DJMcMayhem

@DJMcMayhem Vowels hanya dapat bertukar antara dua kata. Saya akan mengedit.
Kamerad SparklePony

Saya percaya output this is a long test case in case you could not tellharus this is o lang tast cese an cise ou cyould net toll, karena vokal berjalan youdan ouakan ditukar.
Bashful Beluga

@BashfulBeluga Yap, kesalahan saya. Saya akan memperbaikinya.
Kamerad SparklePony

Jawaban:


9

V , 42 , 41 byte

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

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

Penjelasan:

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

Ini akan menempatkan semua grup dari dua kata pada baris mereka sendiri, misalnya:

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

Sekarang kita menjalankan beberapa sihir regex mewah:

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

Regex Anda tidak memerlukan akhir kata di antara dua grup vokal Anda. Cobalah online!
nmjcman101

@ nmjcman101 Apakah Anda melihat revisi lama saya? Karena itulah yang saya miliki sekarang
DJMcMayhem

TIO saya tidak memperbaiki apa pun, saya baru saja mengubah input. Itu bertukar surat aneh.
nmjcman101

@ nmjcman101 Ah, begitu. Diperbaiki sekarang!
DJMcMayhem

6

Japt , 39 37 byte

Mereka mengatakan itu akan jelek, tetapi saya tidak mendengarkan ... dan itu adalah:

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

Uji secara online!

Penjelasan

 ¸  ò ® 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 byte

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


4

Retina , 65 byte

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

Cobalah online! Termasuk kasus uji. Saya ingin menggunakan referensi grup bersyarat tetapi saya tidak bisa membuatnya bekerja dalam 66 byte apalagi 65 atau kurang.


4

Retina , 50 byte

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

Cobalah online!

−2 byte terima kasih kepada Martin.

  • Langkah pertama adalah memisahkan setiap pasangan kata ke barisnya sendiri ( adalah baris baru). Ini memungkinkan kami untuk menggunakan .*sepasang kata.
  • Selanjutnya, untuk setiap baris kita menemukan blok vokal pertama di setiap kata, dan mengurutkannya berdasarkan posisi dalam urutan menurun.

Saya mencoba menghapus dobel [aeiouy]+tetapi tidak bisa mendapatkan sesuatu yang ekonomis.
Kobi

1
Ini sedikit lebih pendek untuk menukar berjalan dengan semacam tahapan: tio.run/…
Martin Ender

@ MartinEnder - Bagus! Saya tidak bisa menyortir untuk bekerja. Saya mencoba versi lain yang menghapus [aeiouy]duplikasi itu, tetapi saya tidak bisa menghentikannya. Saya pikir ini mungkin bekerja dengan baik dengan saran Anda: tio.run/…
Kobi

3

Python 2 , 148 byte

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

Cobalah online!

Golf Code semakin membuat ketagihan!

Bagian dari pasangan kata, kemudian ambil 2 kelompok vokal dan string di antaranya, membalikkan urutan dan menggunakannya sebagai pengganti .


3

Haskell , 177 173 171 169 byte

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)

Cobalah online!

Ini adalah pemendekan langsung dari solusi naif berikut, jadi harus ada sesuatu yang jauh lebih baik di sini:

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 byte

-34 byte terima kasih kepada @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);}

Cobalah online!

Tidak Disatukan:

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
Anda dapat menghapus tanda kurung di sekitar input ( (l)->ke l->). Anda dapat menambah import java.util.regex.*;ke byte-count, dan menghapus semua yang lain java.util.regex.. Anda dapat menghapus tanda kurung di regex ( "([aeiouy]+)"-> "[aeiouy]+"). Dan Anda dapat mengubah String[]s=l.split(" ");ke String s[]=l.split(" "),a,b;, maka Anda dapat menghapus bagian Stringdalam for-loop; Dan Anda bisa berubah String.join(" ",s);menjadi l.join(" ",s);. Ini semua digabungkan. [ 329 bytes ]
Kevin Cruijssen

@KevinCruijssen Memang! Diedit, terima kasih! :-)
Bashful Beluga


1

Ruby, 87 + 1 = 88 byte

Menggunakan -pbendera.

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

Cobalah online!


1

Python 3 , 198 196 192 byte

  • Disimpan 6 byte: terima kasih kepada Zachary T : if(m and n)hingga jika m dan n & menghapus r yang tidak diinginkan untuk string regex, indeks saya mulai dari 1 bukannya 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))

Cobalah online!


1
Saya pikir Anda dapat mencukur tiga byte dari program Anda: satu dengan menghapus r sebelum string Anda, yang lain dengan mengubah i+1<len(a)ke i<=len(a), dan yang ketiga dengan mengubah if(m and n)ke if m and n.
Zacharý

1
Terima kasih. Tetapi i+1<len(a)tidak dapat diubah ke i<=len(a)atau kalau tidak itu akan mencoba untuk mengevaluasi a[j]yaitu a[i+1]untuk i=len(a)dan menyebabkan index out of rangekesalahan:
officialaimm

Maaf, saya membaca itu sebagai i<len(a)+1, wah!
Zacharý

1
Apakah ini akan berhasil? repl.it/IlX1
Zacharý

1
Anda memiliki ruang asing di akhir beberapa baris Anda, saya menghitung 192 byte.
Zacharý
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.