Entfalte musikalische Sprünge

11

Der Dal Segno und Da Capo sind zwei sehr häufig verwendete musikalische Begriffe. Sie bedeuten " vom Zeichen " (𝄋) bzw. " vom Anfang ".

Es gibt auch die Idee der Coda (𝄌), die das Ende eines Musikstücks darstellt. Es ist das, was nach dem "Hauptteil" des Stückes gespielt wird.

Ein DS al Coda ( Dal Segno al Coda ), zum Beispiel, bedeutet „gehen Sie auf die Segno , spielen , bis man dir sagt , zu dem Thema Koda , und dann gibt springen.“

Beschreibung

Ihre Aufgabe bei dieser Herausforderung ist es, Eingaben zu machen, die aus einer beliebigen Anzahl von Noten bestehen, die Dal Segnos und Da Capos enthalten können oder nicht, und dieselbe Musik mit den oben genannten Sprüngen "entfaltet" auszugeben, so dass die Wiederholungen wörtlich erweitert werden.

Eingang

Ihr Code sollte eine Folge von Noten oder Signalen (hier als alles andere als eine Note definiert) als Eingabe verwenden , die durch Leerzeichen in einer Zeichenfolge getrennt sind.

  • Hinweise sind alle a, b, c, d, e, f, oder g, optional mit einem #oder bangefügt (für die Zwecke dieser Herausforderung gibt es keinen Rhythmus).

  • A C(Großbuchstabe c) steht für eine Coda- Kennzeichnung. Es wird immer entweder null oder zwei Coda- Markierungen geben; Die erste Coda- Markierung gibt an, von wo aus gesprungen werden soll, und die zweite gibt an, wohin gesprungen werden soll.

  • Ein S(Großbuchstabe) steht für eine Signo- Markierung. Es gibt immer entweder null oder eine Signo- Markierung (en).

  • Ein F(Großbuchstabe f) steht für eine feine Markierung. Dies "überschreibt" das Ende des Stücks - mehr dazu weiter unten. Es gibt immer entweder null oder eine feine Markierung (en).

  • Jede der folgenden genauen Textzeichenfolgen steht für:

    • D.S. al fine: Gehen Sie zum Signo und spielen Sie bis zum Ende des Stücks oder bis zur feinen Markierung (falls vorhanden).

    • D.S. al coda: Gehe zum Signo , spiele bis zur Coda , springe dann zur zweiten Coda- Markierung und spiele bis zum Ende des Stücks.

    • D.C. al fineGehen Sie zu Beginn, spielen bis zum Ende oder: feine Markierung.

    • D.C. al coda: gehe zum Anfang, spiele bis zur Coda , springe dann zur zweiten Coda- Markierung und spiele bis zum Ende des Stückes.

    Es wird immer ein Minimum von Null und ein Maximum von jeweils einer Saite pro Stück geben. Es wird niemals mehrere al fines oder mehrere al codas in einem Stück geben.

Ausgabe

Ihr Code sollte in einem ähnlichen Zeichenfolgenformat ausgegeben werden: eine Liste von Notizen, die durch Leerzeichen getrennt sind.

Sie können immer davon ausgehen, dass die Ausgabe ein oder mehrere Zeichen lang ist.

Testfälle

In: a# bb c b a
Out:a# bb c b a

In: a S b D.S. al fine c
Out:a b b c

In: a S b C c D.S. al coda d C e
Out:a b c b e

In: a b F c d D.C. al fine e f
Out:a b c d a b

In: a b D.C. al fine c d F e f
Out:a b a b c d

In: a b C c d D.C. al coda e f C g g#
Out:a b c d a b g g#

In: a b D.C. al coda c d C e f C g g#
Out:a b a b c d g g#

In: a b S c d C D.C. al coda C D.S. al fine e f F g
Out:a b c d a b c d c d e f

In: a S b C c D.S. al coda C d D.S. al fine e F f
Out:a b c b d b c d e

In: a b C c d D.C. al coda e f F g g# C gb a# D.C. al fine
Out:a b c d a b gb a# a b c d e f

In: a F b C D.C. al coda C D.C. al fine
Out:a b a b a

In: C a S b D.C. al coda C c D.S. al fine d
Out:a b c b c d

In: a S b D.S. al coda C C c D.C. al fine
Out:a b b c a b c

In: a F C b C D.C. al coda D.C. al fine
Out:a b a a

Regeln

  • Die Markierungen erscheinen immer in einer logischen Reihenfolge. Das heißt, es wird niemals ein SNachher geben D.S.und es wird immer eines Vorher usw. geben.

  • Dies ist , also gewinnt der kürzeste Code in Bytes.

Türknauf
quelle

Antworten:

1

JavaScript (ES6), 253 Byte

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

Erläuterung

Könnte besser Golf gespielt werden, aber ich bin jetzt fertig.

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

Prüfung

user81655
quelle