Развернуть музыкальные прыжки


11

Dal Segno и Da Capo два очень часто используемых музыкальных терминов. Они означают « от знака » (𝄋) и « от начала » соответственно.

Есть также идея коды (𝄌), которая является самым концом музыкального произведения. Это то, что играется после «основного раздела» пьесы.

Например, « DS al coda»Dal Segno al coda» ) означает «иди к сеньо , играй до тех пор, пока тебе не скажут пойти к коду , а затем прыгнуть туда».

Описание

Ваша задача в этой задаче состоит в том, чтобы принимать входные данные, состоящие из любого количества нот, которые могут содержать или не содержать Даль Сеньо и Да Капо, и выводить одну и ту же музыку с вышеупомянутыми прыжками, «развернутыми», так что повторения расшифровываются дословно.

вход

Ваш код должен принимать в качестве входных данных последовательность примечаний или сигналов (здесь определенную как что-либо кроме примечания), разделенных пробелами в одной строке.

  • Примечания являются любыми a, b, c, d, e, f, или g, с необязательным #или bприлагаются (для целей этой проблемы, нет ритма).

  • A C(заглавная c) обозначает маркировку кода . Всегда будет либо ноль, либо две маркировки кода ; первая маркировка кода указывает, куда прыгать, а вторая - куда прыгать.

  • S(Капитал s) представляет собой Signo маркировку. Там всегда будет ноль или один Signo маркировки (ы).

  • F(Капитал е) представляет собой штраф маркировки. Это «переопределяет» конец фрагмента - подробнее об этом ниже. Всегда будет либо ноль, либо одна точная маркировка.

  • Любая из следующих точных строк текста представляет:

    • D.S. al fine: идите к знаку и играйте до конца пьесы или до точной маркировки (если она существует).

    • D.S. al coda: идите к синьо , играйте до кода , затем переходите ко второй маркировке кода и играйте до конца пьесы.

    • D.C. al fine: перейти к началу, играть до конца или точная маркировка.

    • D.C. al coda: идите в начало, играйте до кода , затем переходите ко второй маркировке кода и играйте до конца пьесы.

    Всегда будет минимум с нуля и максимум по одной каждой строке за штуку. Там никогда не будет несколько al fines или несколько al codas в куске.

Вывод

Ваш код должен выводить в похожем формате строки: список заметок, разделенных пробелами.

Вы всегда можете предположить, что в результате вы получите один или несколько символов.

Контрольные примеры

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

правила

  • Маркировка всегда будет отображаться в логическом порядке. То есть никогда не будет Sпосле D.S.и всегда будет до и т. Д.

  • Это , поэтому выиграет самый короткий код в байтах.

Ответы:


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

Тестовое задание

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.