Swep ท่าสระ!


18

หมายเหตุ: ชื่อนั้นสะกดผิดโดยเจตนา

ให้ s string สลับสระแรกของทุก ๆ 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"

เมื่อมีสระที่มีความยาวต่างกันคุณยังคงสลับการวิ่งทั้งหมด เมื่อคำใดมีเสียงสระมากกว่าหนึ่งเสียงคุณยังคงสลับคำแรกเท่านั้น เมื่อคำแรกหรือคำที่สองของคำคู่ไม่มีสระคุณจะไม่เปลี่ยนสระสำหรับคำเหล่านั้น

คุณอาจสันนิษฐานว่าการป้อนข้อมูลประกอบด้วยตัวอักษรตัวอักษรหนึ่งตัวและช่องว่างตัวอักษรหรือตัวคั่นค่าคงที่อื่นหนึ่งกรณี

วิธีการมาตรฐานของ I / O ใช้ช่องโหว่มาตรฐาน Whatevers ชั้นนำ / ต่อท้ายไม่เป็นไร

กรณีทดสอบ:

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
สำหรับผู้ที่สามารถเห็นโพสต์ที่ถูกลบโพสต์ Sandbox ได้ที่นี่
สหาย SparklePony

1
ถ้าคำแรกไม่มีสระมันก็โอเคที่จะสลับสระของคำที่สองและสาม? หรือสระสามารถสลับระหว่างการวิ่งของสองคำเท่านั้น? ตัวอย่างเช่นควรppcg is awesomeเป็นppcg is awesomeหรือppcg as iwesome?
DJMcMayhem

@DJMcMayhem Vowels สามารถสลับระหว่างการรันคำสองคำเท่านั้น ฉันจะแก้ไข
สหาย SparklePony

ฉันเชื่อว่าผลลัพธ์สำหรับthis is a long test case in case you could not tellควรเป็นthis is o lang tast cese an cise ou cyould net tollตั้งแต่สระทำงานyouและouจะถูกสลับ
Beluga ขี้อาย

@BashfulBeluga ใช่ความผิดของฉัน ฉันจะแก้ไข
สหาย SparklePony

คำตอบ:


9

V , 42 , 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

สิ่งนี้จะทำให้กลุ่มของคำสองคำทั้งหมดอยู่ในบรรทัดของตนเองตัวอย่างเช่น:

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

ตอนนี้เราใช้เวทมนตร์ regex แฟนซี:

Í                                           " 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 ของคุณไม่ต้องการคำลงท้ายระหว่างกลุ่มเสียงสระสองกลุ่มของคุณ ลองออนไลน์!
nmjcman101

@ nmjcman101 คุณกำลังดูการแก้ไขแบบเก่าของฉันหรือไม่? เพราะนั่นคือสิ่งที่ฉันมีตอนนี้
DJMcMayhem

ลิงก์ TIO ของฉันไม่ได้แก้ไขอะไรเลยฉันแค่เปลี่ยนอินพุต มันสลับตัวอักษรแปลก ๆ
nmjcman101

@ nmjcman101 อ้าฉันเข้าใจแล้ว แก้ไขทันที!
DJMcMayhem

6

Japt , 39 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

ลองออนไลน์! รวมถึงกรณีทดสอบ ฉันต้องการใช้การอ้างอิงกลุ่มแบบมีเงื่อนไข แต่ฉันไม่สามารถใช้งานได้ใน 66 ไบต์นับประสา 65 หรือน้อยกว่า


4

เรติน่า 50 ไบต์

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

ลองออนไลน์!

by2 ไบต์ขอบคุณมาร์ติน

  • ขั้นตอนแรกแบ่งคำแต่ละคู่ออกเป็นสองบรรทัดบรรทัดใหม่) สิ่งนี้ทำให้เราสามารถใช้งานได้.*ภายในหนึ่งคำ
  • ถัดไปสำหรับแต่ละบรรทัดเราพบบล็อกสระแรกในแต่ละคำและเรียงลำดับตามตำแหน่งจากมากไปหาน้อย

ฉันพยายามลบสองครั้ง[aeiouy]+แต่ไม่สามารถทำอะไรบางอย่างที่ประหยัด
Kobi

1
มันสั้นลงเล็กน้อยเพื่อสลับการวิ่งด้วยสเตจการเรียง: tio.run/…
Martin Ender

@MartinEnder - คนดี! ฉันไม่สามารถทำงานได้ ฉันลองรุ่นอื่นที่ลบการ[aeiouy]ทำสำเนาออกแต่ฉันไม่สามารถตีลงได้ ฉันคิดว่ามันอาจทำงานได้ดีกับคำแนะนำของคุณ: tio.run/…
Kobi

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

Haskell , 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 ไบต์

-34 ไบต์ขอบคุณ @KevinCruijssen

แข็งแรงเล่นกอล์ฟ:

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

ลองออนไลน์!

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

2
คุณสามารถลบวงเล็บที่อยู่รอบ ๆ อินพุต ( (l)->ถึงl->) คุณสามารถเพิ่มไบต์นับและลบอื่น ๆimport java.util.regex.*; ทั้งหมด java.util.regex.คุณสามารถลบวงเล็บใน regex ( "([aeiouy]+)"-> "[aeiouy]+") และคุณสามารถเปลี่ยนString[]s=l.split(" ");เป็นString s[]=l.split(" "),a,b;แล้วคุณสามารถลบStringด้านใน for-loop; และคุณสามารถเปลี่ยนไปString.join(" ",s); นี่คือมันรวมกันทั้งหมด [ 329 bytes ]l.join(" ",s);
Kevin Cruijssen

@KevinCruijssen แน่นอน! แก้ไขแล้วขอขอบคุณ! :-)
Bashful Beluga



1

Python 3 , 198 196 192 ไบต์

  • บันทึก 6 ไบต์: ขอบคุณZachary T : if(m and n)หาก m และ n & ลบ r ที่ไม่ต้องการสำหรับสตริง regex ให้ดัชนีฉันเริ่มจาก 1 แทน 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))

ลองออนไลน์!


1
ฉันคิดว่าคุณสามารถโกนโปรแกรมของคุณได้สามไบต์: อันหนึ่งโดยการลบ r ก่อนสตริงของคุณอีกอันโดยเปลี่ยนi+1<len(a)เป็นi<=len(a)และคนที่สามโดยการเปลี่ยนไปif(m and n) if m and n
Zacharý

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อ๊ะ!
Zacharý

1
จะใช้งานได้ไหม repl.it/IlX1
Zacharý

1
คุณมีช่องว่างภายนอกเมื่อสิ้นสุดบรรทัดบางบรรทัดของคุณฉันนับ 192 ไบต์
Zacharý
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.