Розгортаються музичні стрибки


11

Dal Segno і Da Capo два дуже часто використовуваних музичних термінів. Вони означають " від знака " (𝄋) і " від початку " відповідно.

Існує також ідея коди (𝄌), що в самому кінці музичної п'єси. Це те, що відтворюється після "основної частини" твору.

Наприклад, DS al coda ( Dal Segno al coda ) означає "піти на сеньйо , грай, поки тобі не скажуть піти до коди , а потім перескочи туди".

Опис

Ваша робота в цьому завданні - взяти вклад, складений з будь-якої кількості нот, які можуть містити Дал Сегно і Да Капо , і видати ту саму музику із згаданими вище стрибками «розгорнутою», щоб повторення розширилися дослівно.

Вхідні дані

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

  • Примітки є будь-якими a, b, c, d, e, f, або g, з необов'язковим #або bдодаються (для цілей цієї проблеми, немає ритму).

  • A C(з великої літери c) являє собою маркування коди . Завжди буде або нуль, або дві позначки коду ; перше маркування кодом представляє, звідки стрибати, а друге являє, звідки слід стрибати.

  • Значення S(велика літера ) представляє знакове позначення. Завжди буде або нульове, або одне знакове позначення.

  • Величина F(величина f) являє собою тонку маркування. Це "переосмислює" кінець твору - докладніше про це нижче. Завжди буде або нуль, або одна тонка маркування.

  • Будь-який із наступних точних рядків тексту являє собою:

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

    • D.S. al coda: перейдіть до синьйону , пограйте до коди , потім перейдіть до другої позначки коди та грайте до кінця п'єси.

    • D.C. al fine: переходити до початку, грати до кінця або тонкої розмітки.

    • D.C. al coda: перейдіть до початку, пограйте до коди , потім перейдіть до другої позначки коди і грайте до кінця п'єси.

    Завжди буде мінімум нуль і максимум одна з кожної струни на шматок. Ніколи не буде декількох al fines або декількох al codas у шматку.

Вихідні дані

Ваш код повинен виводитися у подібному рядковому форматі: список приміток, розділених пробілами.

Ви завжди можете припустити, що результат буде мати один або кілька символів.

Тестові справи

В: 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.а завжди буде один і т.д.

  • Це , тому найкоротший код у байтах виграє.

Відповіді:


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.