La La Land… не надо ждать, Му Му Лунный свет

122

Этот конкурс - дань уважения победителю конкурса «Лучшая картина» на Оскаре 2017 « La La Land Moonlight» !


Напишите функцию / программу, которая принимает строку, содержащую только буквы [A-Za-z], четыре символа, которые являются общими в ежедневных предложениях .,'?и пробелах, и выводит строку в стиле La La Land.

Чтобы быть более точным, возьмите буквы до и включая первую группу гласных, и напечатайте / выведите ее дважды, добавляя каждый раз пробел, а затем печатайте / выводите всю строку. у это гласный в этом вызове. Пунктуация и заглавные буквы должны быть сохранены.

Вы можете предположить, что все строки содержат по крайней мере один гласный, и что все строки начинаются с буквы.

Тестовые случаи:

Land
La La Land

Moonlight
Moo Moo Moonlight

quEueIng
quEueI quEueI quEueIng

This isn't a single word.
Thi Thi This isn't a single word.

It's fun to play golf
I I It's fun to play golf

Ooo
Ooo Ooo Ooo

I'm okay
I I I'm okay

Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.

Why is y a vowel?
Why Why Why is y a vowel?

Это поэтому выигрывает самый короткий код на каждом языке. Пояснения приветствуются , также на основных языках.

Стьюи Гриффин
источник
1
Тестовый пример для случая нечувствительности: MOONLIGHT. И просто для удовольствия:Why did the chicken cross the road?
Тит
35
Спонсор
6
Или проф. Квиррелл
Брайан Дж.
1
6-й тестовый набор, купленный вам Луи Примой и Книгой джунглей. Присоединился просто, чтобы добавить этот (плохой) каламбур.
Тоби

Ответы:

57

Sed 30 байтов

s/[^aeiouy]*[aeiouy]\+/& & &/i
Майкл Верс
источник
Не могли бы вы использовать *вместо \+?
Критиси Литос
30

05AB1E , 23 19 18 байт

Сохранено 1 байт благодаря Okx .

Dlð«žOsSåJTk>£D¹ðý

Попробуйте онлайн! или как тестовый набор

объяснение

 Dl                  # create a lowercase copy of implicit input
   ð«                # append a space
     žO              # push the vowels
       s             # swap lowercase input to the top of the stack
        S            # split into a list of chars
         å           # check each char for membership in the vowel-string
                     # (creates a list with 1 at the index of vowels and 0 for non-vowels)
          J          # join to string
           Tk        # find the index of 10
             >       # increment
              £      # take that many items from input
               D     # duplicate this string
                ¹    # push input
                 ðý  # join the strings by space
Emigna
источник
25

Желе , 24 22 20 19 14 байт

-5 байт, используя трюк из блестящего ответа Эминьи (ищите 10 в списке isVowel)

;⁶e€Øyw⁵ḣ@;⁶Ȯ;

Попробуйте онлайн! (не совсем уверен, как сделать набор тестов для этой полной программы)


15- байтовая альтернатива:

;⁶e€Øyw⁵ḣ@;⁶ẋ2;

Вот полный набор тестов.

Как?

;⁶e€Øyw⁵ḣ@;⁶Ȯ; - Main link: string s
 ⁶             - space character
;              - concatenate to s (for all vowel edge case)
    Øy         - vowels + y yield
  e€           - exists in? for €ach (gives a list of isVowel identifiers)
       ⁵       - 10
      w        - index of first sublist (with implicit decimalisation of 10 to [1,0])
        ḣ@     - head with reversed @rguments (start of word up to & including vowel group)
           ⁶   - space character
          ;    - concatenate (start of word up to & including vowel group plus a space)
            Ȯ  - print and yield (hence a full program...
               -     ...the alternative ẋ2 repeats instead in order to return the result)
             ; - join with the input, s
               - implicit print (of the second repetition and input string)
Джонатан Аллан
источник
19

Python, 61 байт

import re;lambda x:re.sub('(.*?[aeiouy]+)',r'\1 \1 \1',x,1,2)

Вот первый не основанный на регулярных выражениях язык (с использованием регулярных выражений).

Сохранено 1 байт благодаря Нейлу .

Эрик Аутгольфер
источник
18

JavaScript (ES6), 40 46

Редактировать 5 + 1 байт, сохраненных thx @Arnauld

Слишком долго по сравнению с другими, используя тот же трюк (как обычно)

x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&')

let f=
x=>x.replace(/.*?[aeiouy]+/i,'$& $& $&')

test=`Land
La La Land

Moonlight
Moo Moo Moonlight

queueing
queuei queuei queueing

This isn't a single word.
Thi Thi This isn't a single word.

It's fun to play golf
I I It's fun to play golf

Ooo
Ooo Ooo Ooo

I'm okay
I I I'm okay

Hmm, no. There will be at least one vowel, but it can be anywhere.
Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere.`
test.split(`\n\n`).forEach(z=>{
  var [i,k]=z.split(`\n`),x=f(i);
  console.log(k==x ? 'OK':'KO',i+'\n'+x);
})

edc65
источник
@ Arnauld нет, но я мог бы использовать '$& $& $&'- я всегда забываю специальные долларовые символы. Спасибо. К сожалению, теперь это действительно порт ответа сетчатки Мартина.
edc65
^Требуется Retina , который - я думаю , - выглядит на все матчи по умолчанию. Но нужно ли нам это здесь?
Арно
@ Arnauld ты снова прав
edc65
-2:x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
nderscore
@ETHproductions на самом деле. Спасибо, что заметили.
edc65
12

Пакетная, 180 байт

@echo off
set/ps=
set v=aeiouy
set g=c
set t=
:l
call set w=%%v:%s:~,1%=%%
if %v%==%w% goto %g%
set g=o
:c
set t=%t%%s:~,1%
set s=%s:~1%
goto l
:o
echo %t% %t% %t%%s%

Реализует конечный автомат. gотслеживает, видели ли мы когда-либо гласную, поэтому, если текущая буква не является гласной, мы знаем, выводить ли или продолжать следующую букву.

Нил
источник
12

PowerShell , 46 47 41 39 38 байт

$args-replace"^.*?[aeiouy]+",(,'$&'*3)

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

Спасибо Maarten Bamelis за исправление

Сохранено 6 байтов благодаря Rynant

Сохранено 2 3 байта благодаря Joey

Бьорн Моленмейкер
источник
8

Рубин, 31 32 30 байт

->s{(s[/.*?[aeiouy]+/i]+' ')*2+s}

Два байта сохранены благодаря GB и Cyoce.

gntskn
источник
6

PHP, 55 54 байта

Примечание: в зашифрованной версии используется кодировка IBM-850.

echo preg_filter("/^(.*?[aeiouy]+)/i","$1 $1 $0",$argn);
echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);     # Encoded

Запустите так:

echo "This isn't a single word." | php -nR 'echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn);'

объяснение

Просто замените регулярное выражение на нестрогое совпадение с любым символом в начале строки, за которым следует любое количество гласных (используйте iпараметр для нечувствительности к регистру). Затем эта группа захвата печатается дважды, за которой следует вся строка.

Tweaks

  • Сохраненный байт с помощью -Rсделать $argnдоступным (Thx Titus)
aross
источник
6

Javascript (ES6), 38 байт

x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x

f=
x=>(y=/.*?[aeiouy]+/i.exec(x)+' ')+y+x
<!-- snippet demo: -->
<input list=l oninput=console.log(f(this.value))>
<datalist id=l><option value=Land>
<option value=Moonlight>
<option value=queueing>
<option value="This isn't a single word.">
<option value="It's fun to play golf">
<option value=Ooo>
<option value="I'm okay.">
<option value="Hmm, no. There will be at least one vowel, but it can be anywhere.">
<option value="Why is y a vowel?">

nderscore
источник
5

С 202 196 195 193 190 180

i,j,k,m,n;f(char*a){if((a[i/12]-"AEIOUY"[i++%6])%32==0)k=n=24-(i%12);else if(k&&!n--){m=j=(i-13)/12;for(i=0;i<j*2;)printf("%c%c",a[i%j],(i==j-1)*32),i++;printf(" %s", a);}m?:f(a);}

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


Вещи, оставленные для игры в гольф:

• Сверните две печати в одну.

• Печать моего пробела может быть изменена на %*cлогику, я уверен.

• Я использую условные выражения, которые можно удалить

j=(i-13)/12может быть сокращено.

• Условная проверка [AY], если ==0это обычно не требуется, хотя в данный момент я остановился на ней (пробовал переключать if-else и отключать все ==0вместе, но для этого требуется добавить {скобки} и увеличить размер байта)


Уловки, которые я использовал для игры в гольф:

• Объединение двойного для поиска строки цикла с использованием модуля по оси X и целочисленного деления по оси Y (входная строка против строки гласного). (Ось X повторяется дважды перед итерацией один раз по оси Y; первый раз с [AZ] и второй раз с [az], используя символьное значение 32 разностное.

• Отказ от необходимости использовать «[AY] и [ay]», просто взяв расстояние между наборами символов и по модулю 32. Таким образом, если расстояние равно 0 (AA) или если расстояние равно 32 (aA)

• Повторное использование целочисленных переменных, которые больше не используются в качестве логических переменных.

• Рекурсивный вызов функции с той же строкой для обработки через нее и исключения второго цикла for.

• Установите значения BOOL в соответствии с логикой установки другой переменной. (например, bool = i = 5;) чтобы выбить обоих одним камнем.

• Тернарная пустота - истинное злоупотребление. (ССЗ)


Читаемый формат:

i,j,k,m,n;
f(char*a){
    if((a[i/12]-"AEIOUY"[i++%6])%32==0)
        k=n=24-(i%12);
    else
        if(k&&!n--){
            m=j=(i-13)/12;
            i=0;
            for(;i<j*2;)
               printf("%c%c",a[i%j],(i==j-1)?32:0),i++;
            printf(" %s", a);
        }
    m?:f(a);
}

Сбил 10 байтов благодаря Кейу Гану (в комментариях)

Альберт Реншоу
источник
Примечание для себя: j=(i-13)/12может быть сокращено.
Альберт Реншоу
Я что-то упустил, или вы могли бы начать с i=j=k=m=n=0;?
Ричард Айронс
@RichardIrons переменные должны быть объявлены первыми.
Альберт Реншоу
Вы можете использовать i,j,k,m,n;для инициализации.
Кейу Ган
@KeyuGan неопределенное поведение, не гарантируется, что всегда будет 0. (насколько я знаю?)
Альберт Реншоу
4

MATL, 33 байта

'(^.*?[yY%s]+)'13Y2YD'$1 $1 $1'YX

Попробуйте это на MATL Online

объяснение

                % Implicitly grab input as a string
'(^.*?[yY%s]+)' % Push this string literal (regex pattern)
13Y2            % Push the string literal 'AEIUOaeiuo'
YD              % Replace the '%s' in the string with 'AEIUOaeiuo'
'$1 $1 $1'     % Push the string literal to use for replacement which repeats
                % the first match 3 times
YX              % Perform regular expression matching and replacement
                % Implicitly display the result
Suever
источник
'(^.*?[yY%s]+)'13Y2YD'$1 '8:)YXсохраняет 2 байта
Луис Мендо
'(^.*?[%s]+)'19Y2YD'$1 '8:)YXсохраняет еще 2
Б. Мехта
@ B.Mehta 19Y2не существовало, когда этот ответ был представлен, к сожалению
Suever
Да, немного ожидал этого ответа ... Я оставлю свой комментарий, чтобы другие тоже могли узнать о встроенном литерале 'aeiouy'.
Б. Мехта
@ B.Mehta Не беспокойся. С помощью MATL Online (matl.suever.net) вы можете выбрать конкретную версию, используя раскрывающийся список в правом верхнем углу
Suever
4

V , 21 , 20 байтов

é /ã[aeiouy]«“.
3ä|<

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

Объяснение:

é               " Insert a space
  /             " Jump forward too...
   ã[aeiouy]«. "   The first non-vowel after a vowel
3ä              " Make three copies of
  |             " Everything from the cursor to the first character
   <            " Delete the space we inserted

HexDump:

00000000: e920 2fe3 5b61 6569 6f75 795d ab93 2e0a  . /.[aeiouy]....
00000010: 33e4 7c3c                                3.|<

Альтернативная версия (21 байт):

Í㨃[aeiouy]«©/± ± &

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

Это использует нелепое сжатие регулярных выражений, и ему все еще удается получить удар от других языков игры в гольф. Для справки, это примерно две трети длины обычной «несжатой» версии, а именно:

:%s/\v\c(.{-}[aeiou]).*/\1 \1 &

Объяснение:

Í                               " Replace on every line:
 ã                              "   Case-insensitive
  ¨              ©              "   Capture-group 1
   <131>                        "   Any character, any number of times (non-greedy)
        [aeiouy]«               "   A vowel, repeated once or more
                  <129>         "   Followed by anything
                       /        " Replaced with:
                        ± ±     "   Capture group one twice, with spaces between
                            &   "   The whole matched pattern

Вот hexdump:

00000000: cde3 a883 5b61 6569 6f75 795d aba9 812f  ....[aeiouy].../
00000010: b120 b120 26                             . . &
DJMcMayhem
источник
2
+1 Это должно быть самое впечатляющее представление V regex, которое я когда-либо видел
Kritixi Lithos
4

Python 3 , 75 68 байт

lambda s:(s[:[x in"aAeEiIoOuUyY"for x in s][1:].index(0)+1]+" ")*2+s

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

Объяснение:

Работает, генерируя логическое значение для каждого символа во входной строке на основе того, является ли он гласным, и находя самый низкий индекс 0первого не гласного (исключая первый символ). Он возвращает подстроку к этому индексу дважды, разделенную пробелами, и исходную строку.

Trelzevir
источник
4

Clojure, 192 188 181 байт

(fn[p](let[[f] p v #(#{\a \e \i \o \u \y}(Character/toLowerCase %))[q r](split-with(if(v f)v #(not(v %)))p)[w _](split-with v r)as #(apply str %)](str(as(repeat 2(str(as q)(as w) \ )))p)))

-4 байта путем встраивания first-sp-pred( упс ).

-7 байт, удалив пропущенные пробелы

Это было гораздо более сложным, чем я думал, что это произойдет! Я вручную разбираю строку ... так как до сих пор не дошел до изучения регулярных выражений: /

Смотрите предварительный гольф код для разбивки:

(defn repeat-prefix-cons [phrase]
  (let [[first-letter] phrase ; Get first letter

        ; Function that checks if a lowercased character is a part of the vowel set
        vowel? #(#{\a \e \i \o \u \y} (Character/toLowerCase %))

        ; cons(onant)? Negation of above
        cons? #(not (vowel? %))

        ; Decide how to split it depending on if the first character is a vowel
        first-sp-pred (if (vowel? first-letter) vowel? cons?)

        ; Split off the first chunk of cons/vowels
        [pre1 r] (split-with first-sp-pred phrase)

        ; Split off the rest of the vowels
        [pre2 r2] (split-with vowel? r)

        ; Shortcut function that turns a list into a string (Basically (join "" some-list-of-strings) )
        as #(apply str %)]

    (str ; ... then concat the prefix in front of the original phrase, and return
      (as ; ...then turn it back into a string since "repeat" returns a list... ^
        (repeat 2 ; ... then repeat it twice (shame Clojure doesn't have string multiplication)... ^
                (str (as pre1) (as pre2) \ ))) ; Concat the 2 prefix parts together with an space at the end... ^
      phrase)))
Carcigenicate
источник
4

Python 3 , 101 96 байт

s=input()
v=i=0
for c in s:
 w=c in'aAeEiIoOuUyY'
 if v*~-w:break
 v=w;i+=1
print(s[:i],s[:i],s)

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

решение без регулярных выражений


комментарии:

s=input()
a='aAeEiIoOuUyY'
v=i=0
for c in s:          # for each character in the string
 w=c in a            # w = True if the character is a vowel, else false
                     # true is equivalent to 1  and false to zero
                     # v*(w-1) evaluates only to true (-1 in this case) if v=1 (last character was a vowel) and w=0 (current character is not a vowel)
 if v*(w-1):break    # if so, break the loop
 v=w;i+=1            # increase the counter and set v to w
print(s[:i],s[:i],s)
овс
источник
Зачем тебе нужен? Заменить w=c in aнаw=c in'aAeEiIoOuUyY'
sagiksp
4

Ом , 19 байт (CP437), не конкурирует

Новый язык, и как таковой, мне пришлось добавить некоторые новые функции, чтобы сделать эту работу, что, к сожалению, делает это неконкурентным (потому что лазейки).

≡┬üC▓αy_ε;TF«u├DQüj

Объяснение:

≡┬üC▓αy_ε;TF«u├DQüj     Main wire, arguments: s

≡                       Triplicate input
 C                    Push input, all lowercase with concatenated space character
    ▓    ;              Map string into an array with...
     αy_ε                 Boolean: is element a vowel?
          TF«u          Find first occurrence of [true, false]
              ├D        Slice input up to that index and duplicate it
                Q       Reverse stack
                 üj     Join on spaces, implicitly print
Ник Клиффорд
источник
Мне интересно узнать, какие функции вы реализовали ...?
Стьюи Гриффин
@StewieGriffin Перестановка стека ( Q), поиск по подрешеткам ( ), uсрезы строк / массивов ( ) и константы гласных ( αvи αy).
Ник Клиффорд
4

PHP, 69 65 53 байта

<?=preg_filter("#.*?[aeiouy]+#i","$0 $0 $0",$argn,1);

требует PHP 5.3 или более поздней версии. Запустите как трубу с -Fили попробуйте несколько версий онлайн .

Сохранено 4 байта (и исправлен код) с помощью регулярного выражения, украденного из @aross;
Еще 10 с preg_filterвместо preg_matchи -F
и еще два с улучшенным регулярным выражением.

75 81 байт для версии без регулярных выражений:

for(;$c=$argn[$i++];)($k+=$k^!trim($c,aeiouyAEIOUY))>1?:$w.=$c;echo"$w $w $argn";

требуется PHP 5 или более поздняя версия; заменить ?:с ?1:более старые PHP. Бежать с-nR

Сломать

for(;$c=$argn[$i++];)       // loop $c through input characters
    ($k+=$k^!                   // 2. !$k and vowel or $k and not vowel: increment $k
        trim($c,aeiouyAEIOUY)   // 1. strip vowels -> vowel=false, non-vowel=true
    )>1                         // 3. if $k>1
    ?                           // do nothing
    :$w.=$c;                    // else append $c to $w
echo"$w $w $argn";          // output
Titus
источник
Не похоже на работу. Вне положенной для This isn't a single word:T T This isn't a single word.
aross
@aross, кажется, проверяет только строчные значения? Я могу ошибаться, я не очень хорошо знаю PHP
Альберт Реншоу
1
@AlbertRenshaw Версия регулярного выражения использует iмодификатор, который делает регистр нечувствительным к регистру. Другая версия проверяла только строчные буквы. Исправлена.
Тит
4

R, 49 байт

sub("(.*?[aeiouy]+)","\\1 \\1 \\1",scan(,""),T,T)

Замените на основе регулярных выражений, сопоставьте все, пока не появится гласная, запишите и замените ее 3 раза.

scanдождавшись doubleввода типа, чтобы сказать, что он должен использовать characterтип, мы должны дать ему два аргумента, во-первых, это значение по умолчанию, строка emtpy для stdin, а во-вторых, оценку R разрешают использовать только, cпоскольку это не является неоднозначным characterв этом контексте.

Tобозначает TRUEи сохраняет некоторый символ как 4-й и 5-й параметр в sub, чтобы он велел игнорировать регистр и использовать PCRE (жадность не совпадает с синтаксисом R regex)

4 байта сохранены благодаря Sumner18 вместе со ссылкой Tio на работающий код

Tensibai
источник
3

Java 8, 147 140 байт

Golfed:

import java.util.regex.*;s->{Matcher m=Pattern.compile("([^aeiouy]*[aeiouy]+)",2).matcher(s);m.find();return m.group()+" "+m.group()+" "+s;}

Ungolfed:

import java.util.regex.*;

public class LaLaLandNoWaitMooMooMoonlight {

  public static void main(String[] args) {
    for (String[] strings : new String[][] { { "Land", "La La Land" }, { "Moonlight", "Moo Moo Moonlight" },
        { "queueing", "queuei queuei queueing" }, { "This isn't a single word.", "Thi Thi This isn't a single word." },
        { "It's fun to play golf", "I I It's fun to play golf" }, { "Ooo", "Ooo Ooo Ooo" },
        { "I'm okay", "I I I'm okay" }, { "Hmm, no. There will be at least one vowel, but it can be anywhere.",
            "Hmm, no Hmm, no Hmm, no. There will be at least one vowel, but it can be anywhere." } }) {
      final String input = strings[0];
      final String expected = strings[1];
      final String actual = f(s -> {
        java.util.regex.Matcher m = java.util.regex.Pattern.compile("([^aeiouy]*[aeiouy]+)", 2).matcher(s);
        m.find();
        return m.group() + " " + m.group() + " " + s;
      } , input);
      System.out.println("Input:    " + input);
      System.out.println("Expected: " + expected);
      System.out.println("Actual:   " + actual);
      System.out.println();
    }

  }

  private static String f(java.util.function.Function<String, String> function, String input) {
    return function.apply(input);
  }
}

Примечание: литерал 2в коде является значением java.util.regex.Pattern.CASE_INSENSITIVE.


источник
2
Я думаю, что вы можете использовать, import java.util.regex.*;чтобы сохранить несколько байтов.
Роман Греф
@ RomanGräf ты прав. У меня были прописаны пакеты, потому что в более ранней версии кода (не работал) было меньше, чтобы не использовать импорт. Я не переоценил после исправления кода.
3

C, 123 байта

#define v(x)while(x strchr("AEIOUY",*s&95))++s;
a;f(s,t)char*s,*t;{t=s;v(!)v()a=*s;*s=0;printf("%s %s ",t,t);*s=a;puts(t);}

Звоните как:

main(){char s[] = "queueing"; f(s);}
Линн
источник
1
Это приятно! Ты выбил мой раствор С из парка, лол.
Альберт Реншоу
2

Пайк , 22 байта

l1~V\y+L{$0R+f2<ssDQdJ

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

Это на 4 байта длиннее, чем следовало бы, если бы я реализовал более короткий способ получения гласных, включая y.

синий
источник
2

Сетчатка, 24 байта

i1`.*?[aeiouy]+
$0 $0 $0

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

mbomb007
источник
Совершенно похоже на это
Emigna
Да, знаю. Но я сделал ответ самостоятельно. Тем не менее, было решено, что дубликаты ответов разрешены, если работа не была плагиатом.
mbomb007
2

Python 3 , 130 102 байта

w=input();a='';v=0
for i in w:
	if i in 'aeiouyAEIOUY': v=1
	elif v:
		break
	a+=i
a+=' ';print(a*2+w)

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

Не использует никаких функций и не использует внешние библиотеки! (Если только печать и ввод не считаются функциями, которые они выполняют).

Работает, видя, выходит ли оно из согласных в начале названия в «гласную зону». Если он находится в «гласной зоне» и обнаруживает согласную, то печатается заголовок.

Сохранено 28 байт благодаря @LliwTelracs

Товарищ Спаркл Пони
источник
2

MATLAB / Octave, 58 51 байт

7 байтов сохранено благодаря @HughNolan

@(x)regexprep(x,'(^.*?[aeiouyAEIOUY]+)','$1 $1 $1')

Создает анонимную функцию с именем, ansкоторую можно вызвать, передав ей строку:ans('Land')

Демо онлайн

Для совместимости с MATLAB $0следует использовать вместо $1вышеуказанной функции.

Suever
источник
Думал об этом, а потом увидел, что ты уже сделал это. Сохраните несколько байтов: @(x)regexprep(x,'^.*?[aeiouyAEIOUY]+','$0 $0 $0 ');- также Matlab, кажется, использует $ 0, а не $ 1 странно
Хью Нолан
@HughNolan Замечательно, спасибо!
Suever
2

C (gcc) , 111 110 байтов

*d="AEIOUYaeiouy";b;f(char*a){b=strcspn(a,d);write(printf(" "),a,write(1,a,b+strspn(a+b,d)));printf(" %s",a);}

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

Он просто использует библиотечные функции strspn()и strcspn()использует порядок, в котором gcc оценивает параметры функции. Немного меньше в гольф

*d="AEIOUYaeiouy";b;
f(char*a){
  b=strcspn(a,d);
  write(printf(" "),a,write(1,a,b+strspn(a+b,d)));
  printf(" %s",a);
}

Спасибо @gastropner за -1.

ceilingcat
источник
Ух ты!! Хорошо сделано!
Альберт Реншоу
105 байт
гастропнер