Buka lompatan musikal

11

The Dal Segno dan Da Capo adalah dua sangat umum digunakan istilah musik. Mereka berarti " dari tanda " (𝄋) dan " dari awal " masing-masing.

Ada juga ide coda (𝄌), yang merupakan akhir dari sebuah musik. Ini yang dimainkan setelah "bagian utama" dari karya tersebut.

A DS al coda ( Dal Segno al coda ), misalnya, berarti "pergi ke segno , bermain sampai Anda diperintahkan untuk pergi ke coda , dan kemudian melompat ke sana."

Deskripsi

Tugas Anda dalam tantangan ini adalah untuk mengambil input yang terdiri dari sejumlah catatan yang mungkin atau mungkin tidak mengandung Dal Segno dan Da Capo dan menghasilkan musik yang sama dengan lompatan yang disebutkan sebelumnya "dibuka" sehingga pengulangan diperluas dengan kata demi kata.

Memasukkan

Kode Anda harus sebagai input urutan catatan atau sinyal (di sini didefinisikan sebagai selain catatan), dipisahkan oleh spasi dalam satu string.

  • Catatan yang salah a, b, c, d, e, f, atau g, dengan opsional #atau bditambahkan (untuk tujuan tantangan ini, tidak ada ritme).

  • A C(modal c) menunjukkan tanda coda . Akan selalu ada nol atau dua tanda coda ; tanda coda pertama mewakili dari mana harus melompat, dan yang kedua mewakili ke mana harus melompat.

  • Sebuah S(modal s) merupakan signo menandai. Akan selalu ada baik nol atau satu signo menandai (s).

  • Tanda F(kapital f) menunjukkan tanda yang baik . Ini "mengganti" bagian akhir karya — lebih dari itu di bawah ini. Akan selalu ada nol atau satu tanda halus .

  • Salah satu string teks berikut ini mewakili:

    • D.S. al fine: pergi ke signo dan mainkan sampai akhir bagian atau tanda halus (jika ada).

    • D.S. al coda: pergi ke signo , mainkan sampai coda , lalu lompat ke tanda coda kedua dan mainkan sampai akhir karya.

    • D.C. al fine: pergi ke awal, bermain sampai akhir atau penandaan halus .

    • D.C. al coda: pergi ke awal, bermain sampai coda , lalu lompat ke tanda coda kedua dan mainkan sampai akhir karya.

    Akan selalu ada minimum nol dan maksimum satu dari setiap string per potong. Tidak akan pernah ada banyak al fines atau kelipatan al codadalam satu potong.

Keluaran

Kode Anda harus ditampilkan dalam format string yang serupa: daftar catatan, dipisahkan oleh spasi.

Anda mungkin selalu berasumsi bahwa output akan berakhir dengan satu atau lebih karakter.

Uji kasus

Masuk: a# bb c b a
Keluar:a# bb c b a

Masuk: a S b D.S. al fine c
Keluar:a b b c

Masuk: a S b C c D.S. al coda d C e
Keluar:a b c b e

Masuk: a b F c d D.C. al fine e f
Keluar:a b c d a b

Masuk: a b D.C. al fine c d F e f
Keluar:a b a b c d

Masuk: a b C c d D.C. al coda e f C g g#
Keluar:a b c d a b g g#

Masuk: a b D.C. al coda c d C e f C g g#
Keluar:a b a b c d g g#

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

Masuk: a S b C c D.S. al coda C d D.S. al fine e F f
Keluar:a b c b d b c d e

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

Masuk: a F b C D.C. al coda C D.C. al fine
Keluar:a b a b a

Masuk: C a S b D.C. al coda C c D.S. al fine d
Keluar:a b c b c d

Masuk: a S b D.S. al coda C C c D.C. al fine
Keluar:a b b c a b c

Masuk: a F C b C D.C. al coda D.C. al fine
Keluar:a b a a

Aturan

  • Tanda-tanda akan selalu muncul dalam urutan logis. Artinya, tidak akan pernah ada Ssetelah D.S.dan akan selalu ada sebelumnya, dll.

  • Ini adalah , jadi kode terpendek dalam byte akan menang.

Gagang pintu
sumber

Jawaban:

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

Penjelasan

Bisa bermain golf lebih baik tapi saya sudah selesai sekarang.

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

Uji

pengguna81655
sumber