Nhảy nhạc mở


11

Các Dal SegnoDa Capo hai rất thường được sử dụng thuật ngữ âm nhạc. Chúng có nghĩa là " từ dấu hiệu " (𝄋) và " từ đầu " tương ứng.

Ngoài ra còn có ý tưởng về coda (), đó là phần cuối của một bản nhạc. Đó là những gì được chơi sau "phần chính" của tác phẩm.

Ví dụ, một DS al coda ( Dal Segno al coda ) có nghĩa là "đi đến segno , chơi cho đến khi bạn được yêu cầu đi đến coda , và sau đó nhảy đến đó."

Sự miêu tả

Công việc của bạn trong thử thách này là lấy đầu vào bao gồm bất kỳ số lượng ghi chú nào có thể có hoặc không chứa Dal SegnoDa Capo và phát ra cùng một bản nhạc với các bước nhảy nói trên "mở ra" để các phần lặp lại được mở rộng ra nguyên văn.

Đầu vào

Mã của bạn sẽ lấy đầu vào là một chuỗi các ghi chú hoặc tín hiệu (ở đây được định nghĩa là bất cứ thứ gì ngoại trừ một ghi chú), được phân tách bằng khoảng trắng trong một chuỗi.

  • Thuyết minh này là bất kỳ a, b, c, d, e, f, hay g, với một tùy chọn #hoặc bnối (đối với mục đích của thử thách này, không có nhịp điệu).

  • A C(vốn c) đại diện cho một dấu coda . Sẽ luôn có 0 hoặc hai dấu coda ; dấu coda đầu tiên đại diện cho nơi để nhảy từ và thứ hai đại diện cho nơi để nhảy đến.

  • Một S(vốn s) đại diện cho một signo đánh dấu. Sẽ luôn có một trong hai không hoặc một signo đánh dấu (s).

  • Một F(vốn f) đại diện cho một dấu hiệu tốt . Điều này "ghi đè" phần cuối của mảnh ghép nhiều hơn ở bên dưới. Sẽ luôn có 0 hoặc một điểm đánh dấu tốt .

  • Bất kỳ chuỗi văn bản chính xác nào sau đây thể hiện:

    • D.S. al fine: Đi đến signo và vui chơi cho đến khi một trong hai phần cuối của mảnh hoặc tốt đánh dấu (nếu nó tồn tại).

    • D.S. al coda: Đi đến signo , chơi cho đến khi coda , sau đó nhảy đến thứ hai coda đánh dấu và chơi cho đến cuối tác phẩm.

    • D.C. al fine: đi đến đầu, chơi cho đến khi kết thúc hoặc đánh dấu tốt .

    • D.C. al coda: đi đến điểm bắt đầu, chơi cho đến khi coda , sau đó nhảy đến dấu coda thứ hai và chơi cho đến khi kết thúc tác phẩm.

    Sẽ luôn có tối thiểu bằng 0 và tối đa là một trong mỗi chuỗi trên mỗi mảnh. Sẽ không bao giờ có nhiều al fines hoặc nhiều al codas trong một mảnh.

Đầu ra

Mã của bạn sẽ xuất ra ở định dạng chuỗi tương tự: một danh sách các ghi chú, được phân tách bằng dấu cách.

Bạn luôn có thể cho rằng đầu ra cuối cùng sẽ dài một hoặc nhiều ký tự.

Các trường hợp thử nghiệm

Trong: a# bb c b a
Ra:a# bb c b a

Trong: a S b D.S. al fine c
Ra:a b b c

Trong: a S b C c D.S. al coda d C e
Ra:a b c b e

Trong: a b F c d D.C. al fine e f
Ra:a b c d a b

Trong: a b D.C. al fine c d F e f
Ra:a b a b c d

Trong: a b C c d D.C. al coda e f C g g#
Ra:a b c d a b g g#

Trong: a b D.C. al coda c d C e f C g g#
Ra:a b a b c d g g#

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

Trong: a S b C c D.S. al coda C d D.S. al fine e F f
Ra:a b c b d b c d e

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

Trong: a F b C D.C. al coda C D.C. al fine
Ra:a b a b a

Trong: C a S b D.C. al coda C c D.S. al fine d
Ra:a b c b c d

Trong: a S b D.S. al coda C C c D.C. al fine
Ra:a b b c a b c

Trong: a F C b C D.C. al coda D.C. al fine
Ra:a b a a

Quy tắc

  • Các dấu sẽ luôn xuất hiện theo thứ tự hợp lý. Đó là, sẽ không bao giờ có Ssau D.S.và sẽ luôn có một cái trước, v.v.

  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ giành chiến thắng.

Câu trả lời:


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

Giải trình

Có thể chơi golf tốt hơn nhưng tôi đã xong rồi.

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

Kiểm tra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.