Müzikal zıplamaları aç


11

Dal Segno ve Da Capo iki çok yaygın olarak kullanılan müzikal terimlerdir. Onlar "demek tabeladan (𝄋) ve" " baştan " sırasıyla.

Bir müzik parçasının sonunu oluşturan koda (𝄌) fikri de var . Eserin "ana bölümünden" sonra çalınan şey budur.

Bir DS al koda ( Dal Segno al coda ), örneğin, vasıta "gidin Segno Gitmek söyleneni kadar oyun coda ve sonra orada atlamak."

Açıklama

Bu meydan okumadaki işiniz, Dal Segno ve Da Capo'ları içerebilecek veya içermeyebilecek herhangi bir sayıda notadan oluşan girdileri almak ve aynı müziği yukarıda anlatılan "açılmamış" atlamalarla çıkarmak, böylece tekrarlar kelimesi kelimesine genişletilmiştir.

Giriş

Kodunuz , bir dizede boşluklarla ayrılmış olarak bir dizi not veya sinyalin (burada not dışında bir şey olarak tanımlanır) girdi olarak alınmalıdır .

  • Notlar herhangi biri a, b, c, d, e, f, ya da g, isteğe bağlı olan #ya da beklenen (bu meydan amaçları için, herhangi bir ritim vardır).

  • Bir C(büyük c) bir koda işaretini temsil eder . Her zaman sıfır veya iki koda işareti olacaktır; ilk koda işareti nereden atlanacağını, ikincisi nereye atlanacağını temsil eder.

  • Bir S(büyük harf ) bir işaret işaretini temsil eder . Her zaman ya sıfır ya da bir olacaktır signon (s) işaretlenmesi.

  • Bir F(büyük f) ince bir işareti temsil eder . Bu, parçanın sonunu "daha çok" geçersiz kılar - daha aşağıda. Her zaman sıfır veya bir ince işaret (ler) olacaktır.

  • Aşağıdaki tam metin dizelerinden herhangi biri aşağıdakileri temsil eder:

    • D.S. al fine: signo'ya gidin ve parçanın sonuna veya ince işaretine (varsa) kadar oynayın .

    • D.S. al coda: Gitmek signo kadar oyun koda sonra ikinci atlamak, coda parçasının sonuna kadar işaretleme ve oyun.

    • D.C. al fine: başa git, sonuna kadar oyna veya ince işaret.

    • D.C. al coda: başlangıca git, kodaya kadar oyna , sonra ikinci koda işaretine atla ve parçanın sonuna kadar oyna.

    Parça başına her zaman en az sıfır ve her bir dizeden en fazla biri olacaktır. Bir parçada asla birden fazla al fineveya birden fazla s olmayacaktır al coda.

Çıktı

Kodunuz benzer bir dize biçiminde çıktı almalıdır: boşluklarla ayrılmış bir not listesi.

Her zaman çıktının bir veya daha fazla karakter uzunluğunda olacağını varsayabilirsiniz.

Test senaryoları

Giriş: a# bb c b a
Çıkış:a# bb c b a

Giriş: a S b D.S. al fine c
Çıkış:a b b c

Giriş: a S b C c D.S. al coda d C e
Çıkış:a b c b e

Giriş: a b F c d D.C. al fine e f
Çıkış:a b c d a b

Giriş: a b D.C. al fine c d F e f
Çıkış:a b a b c d

Giriş: a b C c d D.C. al coda e f C g g#
Çıkış:a b c d a b g g#

Giriş: a b D.C. al coda c d C e f C g g#
Çıkış:a b a b c d g g#

Giriş: a b S c d C D.C. al coda C D.S. al fine e f F g
Çıkış:a b c d a b c d c d e f

Giriş: a S b C c D.S. al coda C d D.S. al fine e F f
Çıkış:a b c b d b c d e

Giriş: a b C c d D.C. al coda e f F g g# C gb a# D.C. al fine
Çıkış:a b c d a b gb a# a b c d e f

Giriş: a F b C D.C. al coda C D.C. al fine
Çıkış:a b a b a

Giriş: C a S b D.C. al coda C c D.S. al fine d
Çıkış:a b c b c d

Giriş: a S b D.S. al coda C C c D.C. al fine
Çıkış:a b b c a b c

Giriş: a F C b C D.C. al coda D.C. al fine
Çıkış:a b a a

kurallar

  • İşaretler her zaman mantıklı bir sırada görünür. Yani, asla a'dan Ssonra D.S.olmayacak ve her zaman önce bir tane olacak vb.

  • Bu , bu yüzden bayttaki en kısa kod kazanacak.

Yanıtlar:


1

JavaScript (ES6), 253 bayt

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

açıklama

Daha iyi golf olabilir ama şimdilik yaptım.

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

Ölçek

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.