音楽ジャンプを展開


11

ダル・セーニョダ・カーポは、 2つの非常に一般的に使用される音楽用語です。彼らは、「意味記号から(𝄋)」と「最初からそれぞれ」。

また、曲の最後であるコーダ(𝄌)の概念もあります。曲の「メインセクション」の後に再生されます。

A DSアルコーダダル・セーニョアルコーダは)、例えば、手段は「に行くSEGNOあなたがに行くように言われているまで、プレーをコーダ、そしてそこにジャンプします。」

説明文

この課題でのあなたの仕事は、Dal SegnoDa Capoが含まれる場合と含まれない場合がある任意の数のノートで構成される入力を取得し、前述のジャンプを「展開」して同じ音楽を出力し、繰り返しが逐語的に拡張されるようにすることです。

入力

コードは、1つの文字列でスペースで区切られた一連のメモまたは信号(ここではメモ以外と定義)のシーケンスを入力として受け取る必要があります。

  • ノートは任意でありabcdef、又はg、任意で#またはb付加(この課題の目的のために、何のリズムが存在しません)。

  • A C(大文字c)はcodaマーキングを表します。コーダマーキングは常にゼロまたは2つあります。最初のコーダマーキングはどこからジャンプするかを表し、2番目のコーダマーキングはどこにジャンプするかを表します。

  • S(資本s)は表しSIGNOマーキングを。常に0または1つのsignoマーキングがあります。

  • F(資本f)は表し細かいマーキングを。これはピースの終わりを「オーバーライド」します。詳しくは以下を参照してください。ゼロまたは1つの微細なマーキングが常に存在します。

  • 以下のテキストの正確な文字列のいずれかが表します。

    • D.S. al finesignoに移動し、曲の最後または細かいマーキング(存在する場合)のいずれかまで再生します。

    • D.S. al codasignoに移動し、コーダまで再生してから、2番目のコーダマーキングにジャンプして、ピースの最後まで再生します。

    • D.C. al fine:最初に移動し、最後または細かいマーキングまで再生します。

    • D.C. al coda:最初に移動し、コーダまで再生してから、2番目のコーダマーキングにジャンプして、ピースの最後まで再生します。

    ピースごとに各ストリングの最小値は常にゼロであり、最大値は1です。ピースに複数al fineのや複数al codaのが含まれることはありません。

出力

コードは同様の文字列形式で出力する必要があります。スペースで区切られたメモのリストです。

出力は最終的に1文字以上になると常に想定することができます。

テストケース

イン:a# bb c b a
アウト:a# bb c b a

イン:a S b D.S. al fine c
アウト:a b b c

イン:a S b C c D.S. al coda d C e
アウト:a b c b e

イン:a b F c d D.C. al fine e f
アウト:a b c d a b

イン:a b D.C. al fine c d F e f
アウト:a b a b c d

イン:a b C c d D.C. al coda e f C g g#
アウト:a b c d a b g g#

イン:a b D.C. al coda c d C e f C g g#
アウト:a b a b c d g g#

イン:a b S c d C D.C. al coda C D.S. al fine e f F g
アウト:a b c d a b c d c d e f

イン:a S b C c D.S. al coda C d D.S. al fine e F f
アウト:a b c b d b c d e

イン:a b C c d D.C. al coda e f F g g# C gb a# D.C. al fine
アウト:a b c d a b gb a# a b c d e f

イン:a F b C D.C. al coda C D.C. al fine
アウト:a b a b a

イン:C a S b D.C. al coda C c D.S. al fine d
アウト:a b c b c d

イン:a S b D.S. al coda C C c D.C. al fine
アウト:a b b c a b c

イン:a F C b C D.C. al coda D.C. al fine
アウト:a b a a

ルール

  • マーキングは常に論理的な順序で表示されます。つまり、アフターアは決してなく、SアフターアフターD.S.は常に1つ前などがあります。

  • これはなので、バイト単位の最短コードが優先されます。

回答:


1

JavaScript(ES6)、253バイト

x=>eval('n=(" "+x).replace(/D.{11}|[CSF]/g,d=>({C:4,S:5,F:6}[d]|(d[2]<"S")*2+(d[8]<"f"))).split` `;for(i=c=f=o="";v=n[++i];v<9?v<4?(n[i]=7,i=0,s=n.indexOf`5`,v==0?f=i=s:v==1?c=i=s:v==2?f=1:c=1):v==4&c?c=!(i=n.indexOf("4",i+1)):v==6&f?i=n:0:o+=v+" ");o')

説明

ゴルフが上手にできるかもしれませんが、今のところは終わりです。

x=>
  eval(`                                  // use eval to enable for loop without return
    n=(" "+x)                             // n = array of [ "", ...notes/commands ]
                                          // empty first element means f and c can be set
                                          //     to i (always true) in the cases below
      // DS fine => 0, DS coda => 1, DC fine => 2, DC coda => 3, C => 4, S => 5, F => 6
      .replace(/D.{11}|[CSF]/g,d=>({C:4,S:5,F:6}[d]|(d[2]<"S")*2+(d[8]<"f")))
      .split\` \`;
    for(
      i=                                  // i = position in note array
      c=                                  // c = look out for coda if true
      f=                                  // f = look out for fine if true
      o="";                               // o = output string
      v=n[++i];                           // v = note/command
      v<9?                                // if not a note
        v<4?(                             // if DS/DC
          n[i]=7,                         // change it to NOP
          i=0,                            // reset i here to save doing it in DC cases
          s=n.indexOf\`5\`,
          v==0?f=i=s:                     // case: D.S. al fine
          v==1?c=i=s:                     // case: D.S. al coda
          v==2?f=1:                       // case: D.C. al fine
          c=1                             // case: D.C. al coda
        ):
        v==4&c?c=!(i=n.indexOf("4",i+1)): // case: C
        v==6&f?i=n:                       // case: F
        0                                 // case: S
      :o+=v+" "                           // add the note
    );o                                   // return the output
  `)

テスト

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