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?
Тит


6
Или проф. Квиррелл
Брайан Дж.

1
6-й тестовый набор, купленный вам Луи Примой и Книгой джунглей. Присоединился просто, чтобы добавить этот (плохой) каламбур.
Тоби

Ответы:



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

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


@ 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отслеживает, видели ли мы когда-либо гласную, поэтому, если текущая буква не является гласной, мы знаем, выводить ли или продолжать следующую букву.



8

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

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

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


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)

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




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

'(^.*?[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                             . . &

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первого не гласного (исключая первый символ). Он возвращает подстроку к этому индексу дважды, разделенную пробелами, и исходную строку.


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

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

Не похоже на работу. Вне положенной для 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 на работающий код


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

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

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

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


Совершенно похоже на это
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вышеуказанной функции.


Думал об этом, а потом увидел, что ты уже сделал это. Сохраните несколько байтов: @(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.


Ух ты!! Хорошо сделано!
Альберт Реншоу


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.