แฉดนตรีกระโดด


11

Dal SegnoและDa Capoสองมากมักใช้แง่ดนตรี พวกเขาหมายถึง " จากเครื่องหมาย " (𝄋) และ " จากจุดเริ่มต้น " ตามลำดับ

นอกจากนี้ยังมีความคิดของcoda (𝄌) ซึ่งเป็นจุดสิ้นสุดของเพลงชิ้นหนึ่ง มันคือสิ่งที่เล่นหลังจาก "ส่วนหลัก" ของชิ้นส่วน

DS อัลตอนจบ ( Dal Segno อัลตอนจบ ) ตัวอย่างเช่นหมายถึง "ไปSegnoเล่นจนกว่าคุณจะบอกว่าจะไปตอนจบแล้วกระโดดมี."

ลักษณะ

งานของคุณในการท้าทายนี้คือการป้อนข้อมูลประกอบด้วยโน้ตจำนวนเท่าใดก็ได้ที่อาจมีหรือไม่มีDal DalnoและDa Capo s และส่งออกเพลงเดียวกันกับการกระโดดข้าม "ดังกล่าว" เพื่อให้การทำซ้ำจะขยายออกเป็นคำต่อคำ

อินพุต

รหัสของคุณควรใช้เป็นลำดับของบันทึกย่อหรือสัญญาณ (ที่นี่กำหนดเป็นอะไรก็ได้ยกเว้นโน้ต) คั่นด้วยช่องว่างในสตริงเดียว

  • หมายเหตุใด ๆ ของa, b, c, d, e, fหรือgมีตัวเลือก#หรือbผนวก (สำหรับวัตถุประสงค์ของความท้าทายนี้ไม่มีจังหวะ)

  • A C(ตัวใหญ่ c) หมายถึงเครื่องหมายตอนจบ ก็คือจะมีทั้งศูนย์หรือสองตอนจบเครื่องหมาย; เครื่องหมายcodaแรกแสดงถึงตำแหน่งที่จะกระโดดจากและเครื่องหมายที่สองแสดงถึงตำแหน่งที่จะข้ามไป

  • S(เมืองหลวง s) แสดงให้เห็นถึงSignoเครื่องหมาย ก็คือจะมีทั้งศูนย์หรือหนึ่งSignoเครื่องหมาย (s)

  • F(เมืองหลวงฉ) หมายถึงการปรับการทำเครื่องหมาย "แทนที่" ส่วนท้ายของส่วนนี้ - เพิ่มเติมจากด้านล่าง ก็คือจะมีทั้งศูนย์หรือหนึ่งปรับเครื่องหมาย (s)

  • สตริงข้อความที่ถูกต้องใด ๆ ต่อไปนี้แสดง:

    • D.S. al fine: ไปที่Signoและเล่นจนถึงปลายทั้งสองของชิ้นหรือที่ปรับเครื่องหมาย (ถ้ามี)

    • D.S. al coda: ไปที่signoเล่นจนกระทั่งcodaจากนั้นข้ามไปที่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หลังจาก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
  `)

ทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.