Sesli harfleri süpür!


18

Not: Başlık bilerek yanlış yazılmıştı.

Bir dize verildiğinde, her 2 kelimenin ilk sesli harflerini değiştirir. Bu meydan okuma için, y sesli harf olarak kabul edilir.

Örneğin, "harika bir gün efendim" girdisi verildiğinde:

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"

Farklı uzunluklarda sesli harfler çalıştığında, yine de tüm işlemleri değiştirirsiniz. Bir kelimede birden fazla sesli harf çalışıyorsa, yalnızca ilk kelimeyi değiştirirsiniz. Bir çift kelimenin ilk veya ikinci kelimesinde sesli harf olmadığında, sesli harfleri bu kelimeler için değiştirmezsiniz.

Girişin yalnızca bir harf alfabetik harf ve değişmez boşluk veya başka bir sabit sınırlayıcıdan oluştuğunu varsayabilirsiniz.

Standart I / O yöntemleri, standart boşluklar uygulanır. Önde gelen / takip eden avcılar iyidir.

Test senaryoları:

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
Silinmiş yayınları görebilenler için korumalı alan yayını buradaydı .
SparklePony Yoldaş

1
İlk kelimenin sesli harfleri yoksa, ikinci ve üçüncü kelimelerin sesli harflerini değiştirmek uygun mudur? Veya ünlüler sadece iki kelimeden oluşan gruplar arasında değişebilir mi? Örneğin, gereken ppcg is awesomehaline ppcg is awesomeya ppcg as iwesome?
DJMcMayhem

@DJMcMayhem Ünlüler sadece iki kelimeden oluşan çalışmalar arasında geçiş yapabilir. Ben düzenleyeceğim.
SparklePony Yoldaş

Sesli harf çalıştığından ve değiştirileceğinden çıktısının olması this is a long test case in case you could not tellgerektiğine inanıyorum . this is o lang tast cese an cise ou cyould net tollyouou
Bashful Beluga

@BashfulBeluga Evet, benim hatam. Düzelteceğim.
SparklePony Yoldaş

Yanıtlar:


9

V , 42 , 41 bayt

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

Çevrimiçi deneyin!

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

Açıklama:

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

Bu, iki kelimeden oluşan tüm grupları kendi satırlarına koyacaktır, örneğin:

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

Şimdi bazı fantezi regex-magic çalıştırın:

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

Normal ifadeniz iki sesli harf grubunuz arasında bir sözcüğün bitmesini gerektirmez. Çevrimiçi deneyin!
nmjcman101

@ nmjcman101 Eski revizyonuma mı bakıyorsunuz? Çünkü şu anda sahip olduğum şey tam olarak bu
DJMcMayhem

TIO bağlantım hiçbir şeyi düzeltmiyordu, girdiyi değiştirdim. Harfleri tuhaf bir şekilde değiştirir.
nmjcman101

@ nmjcman101 Ah, anlıyorum. Şimdi düzeltildi!
DJMcMayhem

6

Japt , 39 37 bayt

Çirkin olacağını söylediler, ama dinlemedim ... ve öyleydi:

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

Çevrimiçi test edin!

açıklama

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

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


4

Retina , 65 bayt

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

Çevrimiçi deneyin! Test senaryolarını içerir. Bir koşullu grup referansı kullanmak istedim, ancak 65 veya daha az olan 66 baytta çalışmaya başlayamadım.


4

Retina , 50 bayt

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

Çevrimiçi deneyin!

To Martin sayesinde 2 bayt.

  • İlk adım, her kelime çiftini kendi satırına bölmek ( bölmektir satırsonu). Bu, .*bir çift kelime içinde kullanmamızı sağlar .
  • Daha sonra, her satır için her kelimedeki ilk sesli harf bloğunu buluruz ve bunları azalan sırada sıralarız.

İkili çıkarmayı denedim [aeiouy]+ama ekonomik bir şey alamadım.
Kobi


@MartinEnder - İyi biri! Çalışmak için sıralama yapamadım. [aeiouy]Çoğaltmayı kaldıran başka bir sürümü denedim , ancak golf oynayamam. Bence öneriyle iyi çalışabilir: tio.run/…
Kobi

3

Python 2 , 148 bayt

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

Çevrimiçi deneyin!

Kod Golf bağımlılık oluyor!

Bölümler sözcük çiftlerini keser, sonra 2 sesli harf grubunu ve aradaki dizeyi alır, sırası tersine çevirir ve bunu yerine geçer .


3

Haskell , 177 173 171 169 bayt

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)

Çevrimiçi deneyin!

Bu, aşağıdaki saf çözümün doğrudan kısaltılmasıdır, bu yüzden burada daha iyi bir şey olmalı:

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 bayt

@KevinCruijssen sayesinde -34 bayt

golfed:

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

Çevrimiçi deneyin!

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
Girdi ( (l)->to l->) çevresindeki parantezleri kaldırabilirsiniz . import java.util.regex.*;Bayt sayısına ekleyebilir ve diğer tüm öğeleri kaldırabilirsiniz java.util.regex.. Parantezleri normal ifadeden kaldırabilirsiniz ( "([aeiouy]+)"-> "[aeiouy]+"). Ve değiştirebileceğiniz String[]s=l.split(" ");için String s[]=l.split(" "),a,b;, o zaman kaldırabilirsiniz Stringiç For döngüsü; Ve değiştirebilir String.join(" ",s);için l.join(" ",s);. İşte hepsi bir arada. [ 329 bayt ]
Kevin Cruijssen

@KevinCruijssen Gerçekten! Düzenlendi, teşekkürler! :-)
Bashful Beluga



1

Piton 3 , 198 196 192 bayt

  • 6 bayt kaydedildi: Zachary T sayesinde : if(m and n)m ve n olursa ve regex dizesi için istenmeyen r kaldırılırsa, dizin i 0 yerine 1'den başlar
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))

Çevrimiçi deneyin!


1
Ben size bir program kapalı üç bayt tıraş edebilirsiniz düşünüyorum: değiştirerek, dizenizle önce başka r kaldırarak tek i+1<len(a)için i<=len(a)ve değiştirerek üçüncü if(m and n)etmek if m and n.
Zacharý

1
Teşekkürler. Ama i+1<len(a)hiç değiştirilemez i<=len(a)illâ o değerlendirmek için çalışacağız a[j]ie a[i+1]için i=len(a)ve neden index out of rangehata:
officialaimm

Üzgünüm, bunu okuyordum i<len(a)+1, hata!
Zacharý

1
Bu işe yarar mı? repl.it/IlX1
Zacharý

1
Bazı satırlarınızın sonunda fazla boşluklar var, 192 bayt saydım.
Zacharý
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.