展开音乐跳跃


11

连续记号初音岛是两个非常常用的音乐术语。它们分别表示“ 从符号 ”(𝄋)和“ 从头开始 ”。

另外还有的想法尾声(𝄌),这是一首乐曲的最后一刻。这是作品“主要部分”之后的内容。

例如,DS al codaDal Segno al coda)的意思是“去找segno,玩直到被告知要去到coda,然后跳到那里。”

描述

在此挑战中,您的工作是接受由可能包含或不包含Dal SegnoDa Capo的任意数量的音符组成的输入,并输出带有上述“未展开”的相同乐曲,以便使重复音节逐字扩展。

输入值

您的代码应将一系列音符或信号(此处定义为除音符)作为输入,并在一个字符串中用空格分隔。

  • 调为任意的abcdef,或g,具有可选的#b附加的(对于这一挑战的目的,没有节奏)。

  • 一个C(大写C)表示结尾标记。总会有零个或两个尾声标记;第一个尾声标记表示从何处跳转,第二个尾声表示从何处跳转。

  • 一个S(大写S)表示预兆报标记。签名标记始终为零或一个。

  • 一个F(大写F)表示精细标记。这“覆盖”了作品的结尾,更多内容在下面。始终会有零个或一个精细的标记。

  • 以下任何精确的文本字符串均表示:

    • D.S. al fine:去SIGNO和玩到一块的任何一个结束或精细标记(如果存在的话)。

    • D.S. al coda:去SIGNO,玩,直到结尾,然后跳转到第二个结尾标记和发挥,直至曲终。

    • D.C. al fine:从头开始,播放到结尾或精细标记。

    • D.C. al coda:去年初,玩,直到结尾,然后跳转到第二个结尾标记和发挥,直至曲终。

    每段中每个字符串始终始终为零,最多为一个。一块中永远不会有多个al fine或多个al coda

输出量

您的代码应以类似的字符串格式输出:注释列表,以空格分隔。

您可能总是假设输出最终将是一个或多个字符长。

测试用例

进: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后继者a D.S.,永远会有一个前者等等。

  • 这是,因此以字节为单位的最短代码将获胜。

Answers:


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

测试

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.