Погладьте голосні голоси!


18

Примітка: заголовок було написано навмисно.

Давши рядок s, поміняйте місцями перші проговори голосних кожні 2 слова. Для цього виклику y вважається голосним.

Наприклад, давши вклад "великий день сер":

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"

Коли є голосні прогони різної довжини, ви все одно змінюєте місцями. Коли слово має більше ніж один голосний, ви все одно змінюєте лише перший. Коли в першому чи другому слові пари слів немає голосної, то ви не замінюєте голосні на ці слова.

Ви можете припустити, що вхід складається лише з одного випадку букв алфавіту та буквального простору або іншого постійного роздільника.

Застосовуються стандартні методи вводу / виводу, стандартні лазівки Провідні / задні ваттери добре.

Тестові приклади:

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
Якщо в першому слові немає голосних, чи добре поміняти голосні слова другого та третього слів? Або голосні звуки можуть змінюватися лише між двома словами? Наприклад, має 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заміняється.
Bashful 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

Тепер ми виконуємо кілька фантазійних регекс-магій:

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

Для вашого регулярного вираження не потрібно закінчувати слово між вашими двома голосними групами. Спробуйте в Інтернеті!
nmjcman101

@ nmjcman101 Ви дивитесь на мою стару версію? Тому що саме це я зараз
маю

Мій 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]+
$`
¶

Спробуйте в Інтернеті!

-2 байти завдяки Мартіну.

  • Першим кроком є ​​розділення кожної пари слів на власний рядок ( це новий рядок). Це дозволяє нам використовувати.* в межах пари слів.
  • Далі для кожного рядка ми знаходимо перший блок голосних у кожному слові та сортуємо їх за позицією у порядку зменшення.

Я спробував зняти дубль, [aeiouy]+але не міг отримати щось економічне.
Кобі


@MartinEnder - Приємний! Я не міг змусити сортувати роботу. Я спробував іншу версію, яка видалила [aeiouy]дублювання, але я не можу це зробити. Я думаю, що це може добре працювати з вашою пропозицією: tio.run/…
Кобі

3

Пітон 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())

Спробуйте в Інтернеті!

Code Golfing стає захоплюючою!

Відрізає пари слів, потім захоплює 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);}

Спробуйте в Інтернеті!

Безголовки:

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.. Ви можете видалити круглі дужки в регулярному виразі ( "([aeiouy]+)"-> "[aeiouy]+"). І ви можете змінити, String[]s=l.split(" ");щоб String s[]=l.split(" "),a,b;потім вийняти Stringвнутрішню петлю for; І ви можете змінитись String.join(" ",s);на l.join(" ",s);. Ось це все поєднано. [ 329 байт ]
Кевін Кройсейсен

@KevinCruijssen Дійсно! Відредаговано, дякую! :-)
Bashful Beluga



1

Python 3 , 198 196 192 байт

  • Збережено 6 байтів: завдяки Zachary T : if(m and n)до if m і n & видалено небажане r для рядка regex, індексу i, починаючи з 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ý
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.