ラ・ラ・ランド…待てない、Moo Moo Moonlight


122

このチャレンジは、オスカー2017のベストピクチャーの勝者、La La Land Moonlightへのオマージュです!


文字[A-Za-z]、毎日の文.,'?とスペースに共通する4つの記号 のみを含む文字列を受け取り、La La Landのスタイルで文字列を出力する関数/プログラムを作成します。

具体的には、最初の母音グループまでの文字を取得し、毎回スペースを追加して2回印刷/出力してから、文字列全体を印刷/出力します。yは、この課題の母音です。句読点と大文字を使用する必要があります。

すべての文字列に少なくとも1つの母音が含まれ、すべての文字列が文字で始まると仮定できます。

テストケース:

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
スポンサー:国立
St音

6
またはQuirrell教授
ブライアンJ

1
ルイプリマとジャングルブックから購入した6番目のテストケース。この(悪い)しゃれを追加するためだけに参加しました。
トビー

回答:



30

05AB1E23 19 18バイト

Okxのおかげで1バイト節約されました

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 バイト

Emignaの素晴らしい回答からのトリックを利用して-5バイト(isVowelリストで10を探します)

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


18

JavaScript(ES6)、40 46

@Arnauldで保存された5 + 1バイトの編集

同じトリックを使用する他のものと比較して非常に長い(通常どおり)

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

^デフォルトではすべての一致を検索します-私は考える-その網膜に必要とされます。しかし、ここで本当に必要なのでしょうか?
アーナルド

あなたは再び右だ@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のおかげで2バイト節約されました。


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ます(大文字と小文字を区別しないオプションを使用します)。そのキャプチャグループは2回印刷され、その後に文字列全体が続きます。

微調整

  • を使用-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

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

オンラインでお試しください!


ゴルフに残されたもの:

•2つのprintfを1つに折りたたみます。

•スペース文字の印刷は、%*c確かにロジックに変更できます。

•何らかの形で削除できる条件を使用しています

j=(i-13)/12短縮される可能性があります。

•[AY]条件チェック==0は、通常は不要かどうかを確認しますが、私は現在、その1つに固執しています(if-elseの切り替えと==0完全な廃止を試みましたが、さらに{ブラケット}を追加し、バイトサイズを増やす必要があります)


これまでゴルフで使ってきたコツ:

•x軸のモジュロとy軸の整数除算(入力文字列と母音文字列)を使用して、ループ文字列検索のdoubleを組み合わせました。(X軸は、Y軸で1回反復する前に2回ループします。1回目は[AZ]で、2回目は[az]で文字値32の差分を使用します。

•文字セット間の距離とモジュロ32を取得することにより、「[AY]および[ay]」を使用する必要がなくなりました。距離が0(AA)または距離が32(aA)の場合

ブール変数として使用されなくなった整数変数の再利用。

•同じ文字列で関数を再帰的に呼び出して処理し、2番目のforループを回避します。

BOOL値を別の変数を設定するロジックに設定します。(たとえば、bool = i = 5;)1つの石で両方をノックアウトします。

•3項の空の真の悪用の悪用。(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);
}

Keyu Ganのおかげで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:)YX2バイトを節約
ルイスメンドー

'(^.*?[%s]+)'19Y2YD'$1 '8:)YXさらに2
Bを

19Y2残念ながらこの回答が提出されたとき、@ B.Mehta は存在しませんでした
Suever

ええ、その返事を少し期待していました...他の人も組み込みの文字列「aeiouy」について学ぶことができるように、私はコメントを続けます。
B.メータ

@ B.Mehta心配ありません。MATLオンライン(matl.suever.net)を使用すると、右上にあるドロップダウンを使用して特定のバージョンを選択することができます
Suever

4

V21、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]«©/± ± &

オンラインでお試しください!

これはばかげた正規表現の圧縮を使用しますが、それでも他のゴルフ言語に突き付けられます。参考までに、これは通常の「非圧縮」バージョンの長さの約2/3です。

:%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の正規表現の提出に持っている
牛はいんちき


4

Pythonの375の 68バイト

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

オンラインでお試しください!

説明:

母音であるかどうかに基づいて入力文字列のすべての文字に対してブール値を生成し0、最初の非母音(最初の文字を除く)の最も低いインデックスを見つけます。スペースで区切られたこのインデックスにサブストリングを2回返し、元のストリングを返します。


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の3101の 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 aw=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か、オンラインでいくつかのバージョンを試してください

@arossから盗まれた正規表現で4バイトを保存(およびコードを修正)。
10でより多くpreg_filterの代わりpreg_match-F
し、改良された正規表現を有する別の2。

非正規表現バージョンの 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正規表現バージョンiは、正規表現の大文字と小文字を区別しない修飾子を使用します。もう1つのバージョンは小文字のみをチェックしました。一定。
タイタス

4

R、49バイト

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

正規表現ベースの置換、母音でない限りすべてを一致させ、それ自体を3回キャプチャして置換します。

scandouble型の入力を待って、型を使用するように指示characterするために、2つの引数を指定する必要があります。1つ目は、stdinのデフォルトの空文字列で、2つ目は、R評価ccharacterはこのコンテキストで曖昧ではない場合のみ使用できます。

TTRUEsubの4番目と5番目のパラメーターとしていくつかのcharを表して保存し、大文字小文字を無視してPCREを使用するように指示します(貪欲さはR正規表現構文とは異なります)

Sumner18のおかげで、実行中のコードへのTio リンクとともに4バイト節約


3

Java 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ソリューションをノックアウトしました笑。
アルバートレンショー


2

網膜、24バイト

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

オンラインで試す


これにかなり似ています
エミナ

ええ、知っています。しかし、私は独立して答えをしました。それでも、作業が盗用されない場合、重複した回答が許可されることが決定されました。
mbomb007

2

Pythonの3130の 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)

オンラインでお試しください!

いかなる種類の機能も外部ライブラリも使用しません!(印刷および入力が機能としてカウントしない限り、機能します)。

タイトルの最初の子音から「母音ゾーン」に入るかどうかを確認することで機能します。「母音ゾーン」にあり、子音が検出されると、タイトルが出力されます。

@LliwTelracsのおかげで28バイト節約


2

MATLAB /オクターブ、58 51バイト

@HughNolanのおかげで7バイト節約

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

ans文字列を渡すことで呼び出すことができるという名前の匿名関数を作成します。ans('Land')

オンラインデモ

MATLABとの互換性のために、上記の関数の$0代わりに使用する必要が$1あります。


これについて考えていて、それが既に完了しているのを見ました。数バイト節約します。@(x)regexprep(x,'^.*?[aeiouyAEIOUY]+','$0 $0 $0 ');-Matlabは奇妙なことに$ 1ではなく$ 0を使用しているようです
ヒューノーラン

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

-1の@gastropnerに感謝します。


ワオ!!よくやった!
アルバートレンショー


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.