La La Land ... не чекайте, Му Му Мун Місячне світло


122

Цей виклик є вшануванням переможця "Найкращої картини" на "Оскарах 2017", " Місячне світло" La La Land !


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

Щоб бути більш конкретним, візьміть букви до першої групи голосних і включіть її два рази, додаючи пробіл кожен раз, після чого надрукуйте / виведіть весь рядок. y - голосна в цьому виклику. Пунктуацію та велику літери слід зберігати.

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

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

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-й тестовий випадок, куплений вам Луї Примою та Книгою про джунглі. Приєднався лише для того, щоб додати цю (погану) каламбур.
Тобі

Відповіді:



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

Пітон, 61 байт

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

Тут з'являється перша мова на основі не-регулярних виразів (за допомогою regex).

Збережено 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варіант для нечутливості регістру). Потім група захоплення друкується двічі, після чого йде весь рядок.

Налаштування

  • Збережено байт, використовуючи, -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);}

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


Річ зліва для гольфу:

• Згорніть два printf в один.

• Друк мого космічного знака можна змінити на %*cлогіку, я впевнений.

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

j=(i-13)/12можливо, може бути скорочено.

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


Прийоми, якими я займався гольфу:

• Комбінований дубль для пошуку рядкового циклу, використовуючи модуль для осі x та цілочисельний поділ для осі y (вхідний рядок проти голосного рядка). (Вісь X кружляється двічі перед повторенням одного разу по осі y; перший раз з [AZ] і вдруге з [az], використовуючи значення символу 32 диференціала.

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

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

• Рекурсивно викликає функцію однією і тією ж строкою, щоб обробляти її і уникати другого циклу.

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

• Зловживання терміналом порожніх справжніх подвигів. (GCC)


Читальний формат:

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

Ось шістнадцятковий набір:

00000000: cde3 a883 5b61 6569 6f75 795d aba9 812f  ....[aeiouy].../
00000010: b120 b120 26                             . . &

2
+1 Це повинно стати найбільш вражаючою подачею V-регексу, яку я коли-небудь бачив
корови лунають


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

-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 Stack reversal ( 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 wordT T This isn't a single word.
Викладено

@aross здається, це перевірка лише малих значень? Я можу помилятися, я не знаю PHP так добре
Альберт Реншо

1
@AlbertRenshaw У версії regex використовується iмодифікатор, який робить випадок регексу нечутливим. Інша версія перевіряла лише малі літери. Виправлено.
Тит

4

R, 49 байт

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

Замінити на основі Regex, порівнювати все, поки не буде голосний, захопити та замінити його 3 рази.

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

Tрозшифровує TRUEта зберігає деякий char як 4-й та 5-й параметр, щоб підказати йому ігнорувати регістр та використовувати PCRE (жадібність не однакова з синтаксисом R regex)

4 байти зберегли ввічливість Sumner18 разом із посиланням Tio на запущений код


3

Ява 8, 147 140 байт

Гольф:

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

Безголовки:

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
Це добре! Ти вибив моє рішення C з парку LOL.
Альберт Реншо



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()і використовує порядок , в якому ПКУ оцінює параметри функції. Трохи менше гольфу

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