음악 점프 펼치기


11

달 세뇨다카포는 두 개의 매우 일반적으로 사용되는 음악 용어입니다. 그들은 "의미 부호에서 (𝄋)와" " 처음부터 "각각.

음악의 끝인 코다 (𝄌)에 대한 아이디어도 있습니다 . 작품의 "메인 섹션"이후에 재생되는 것입니다.

DS 알 코다 ( 달 세뇨 알 코다 ), 예를 들어, 수단 "은 이동 SEGNO 당신이에 가고 듣는다 때까지 플레이를 종결 한 다음이 뛰어."

기술

이 도전에서 당신의 임무는 Dal SegnoDa Capo를 포함 할 수도 있고 포함하지 않을 수있는 많은 노트로 구성된 입력을 취하고 위에서 언급 한 점프 "펼침"으로 동일한 음악을 출력하여 반복이 그대로 확장되도록하는 것입니다.

입력

코드는 하나의 문자열에서 공백으로 구분 된 일련의 음표 또는 신호 (여기서는 음표 이외의 것으로 정의) 를 입력으로 사용해야 합니다.

  • 노트의이다 a, b, c, d, e, f, 또는 g선택 사양으로 #또는 b추가 (이 문제의 목적을 위해, 어떤 리듬이 없다).

  • A C(자본 c)는 코다 표시를 나타냅니다 . 항상 0 또는 2 개의 코다 표시 가있을 것입니다 . 첫 번째 코다 표시는 점프 할 위치를 나타내고 두 번째 코다 표시는 점프 할 위치를 나타냅니다.

  • S(자본들) 대표 SIGNO 표시합니다. 항상 0 또는 1 개의 서명 표시 가있을 것 입니다.

  • F(자본 F)을 나타내는 미세 마킹. 이것은 조각의 끝을 "재정의"합니다. 아래에서 더 자세히 설명합니다. 항상 0 또는 1 개의 미세 표시가 있습니다.

  • 다음과 같은 정확한 텍스트 문자열은 다음을 나타냅니다.

    • D.S. al fine: signo 로 이동 하여 조각의 끝 또는 미세 표시 (있는 경우)가 나올 때까지 재생하십시오 .

    • D.S. al coda: signo 로 가서 coda 까지 연주 한 다음 두 번째 coda 표시 로 점프 하여 조각의 끝까지 연주하십시오.

    • D.C. al fine: 처음으로 이동하여 끝 또는 미세 표시 까지 재생 합니다.

    • D.C. al coda: 시작 부분으로 이동하여 coda 까지 재생 한 다음 두 번째 coda 표시로 이동하여 조각 끝까지 재생합니다.

    조각 당 각 문자열의 최소 0과 최대 1이 항상 있습니다. 한 조각에 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후에 는 결코 D.S.없을 것이며 항상 앞에 등이있을 것입니다.

  • 이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

답변:


1

자바 스크립트 (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
  `)

테스트

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.