Убери гласные!

18

Примечание: название было написано с ошибкой преднамеренно.

Если задана строка s, поменяйте местами первые гласные через каждые 2 слова. Для этого вызова у считается гласным.

Например, с учетом ввода «великий день, сэр»:

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 гласные могут поменяться местами только между двумя словами. Я буду редактировать.
Товарищ 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будет поменяться местами.
Застенчивая Белуга
@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
DJMcMayhem
источник
Ваше регулярное выражение не требует конца слова между вашими гласными группами. Попробуйте онлайн!
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
ETHproductions
источник
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` `

darrylyeo
источник
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]+но не мог получить что-то экономичное.
Коби
1
Немного
Мартин Эндер
@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())

Попробуйте онлайн!

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)
bartavelle
источник
2

Java (OpenJDK 8) ,363 304 + 25 байт

-34 байта благодаря @KevinCruijssen

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

Попробуйте онлайн!

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.. Вы можете удалить скобки в регулярном выражении ( "([aeiouy]+)"-> "[aeiouy]+"). И вы можете изменить String[]s=l.split(" ");на String s[]=l.split(" "),a,b;, затем вы можете удалить Stringвнутри цикла for; И вы можете изменить String.join(" ",s);на l.join(" ",s);. Вот все это вместе. [ 329 байт ]
Кевин Круйссен,
@KevinCruijssen Действительно! Отредактировано, спасибо! :-)
Застенчивая Белуга
1

Python 3 , 198 196 192 байта

  • Сохранено 6 байтов: благодаря Zachary T : if(m and n)если m и n & удалили нежелательные r для строки регулярного выражения, индекс 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))

Попробуйте онлайн!

officialaimm
источник
1
Я думаю, что вы можете сбрить три байта из вашей программы: один, удалив r перед строкой, другой, изменив i+1<len(a)на i<=len(a), и третий, изменив 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
Zacharý
1
У вас есть посторонние пробелы в конце некоторых ваших строк, я насчитал 192 байта.
Захари