Müzik Yapalım!


11

Birçok insan eğlence ve eğlence için müzik çalmayı sever. Ne yazık ki, müzik bazen oldukça zor. Bu yüzden buradasınız!

Görev

Onunla mücadele edenler için müzik okumayı daha kolay hale getirmek sizin işiniz. Bir müzikal kadroyu girdi olarak alan ve bu kadroya yazılan notların adlarını veren bir program veya işlev yazmanız gerekir.

Personel, nota anahtarı ve notlar

Bir müzikal personel veya stave, aralarında dört boşluk olan beş yatay çizgidir. Her çizgi veya boşluk, nota anahtarı bağlı olarak farklı bir notayı (tiz) temsil eder.
Aralarından seçim yapabileceğiniz çok az farklı müzik nota anahtarı var , ancak şimdilik sadece biriyle ilgileneceğiz: tiz nota anahtarı . Tiz nota anahtarı üzerinde, notlar personel üzerinde aşağıdaki gibi temsil edilir:

Çizgiler
F ----------
D ----------
B ----------
G ----------
E ----------
Spaces  
   ----------  
E
   ----------  
C
   ----------  
bir
   ----------  
F
   ----------

Girişin biçimlendirilmesi

Giriş aşağıdaki gibi tek bir dize olarak verilecektir:

---------------

---------------

---------------

---------------

---------------

Personelin beş satırı ve dört boşluğu dokuz karakterlik sıradan oluşmaktadır. Personelin satırları -(tire) karakterleri ve boşluklarla (boşluk) oluşturulur. Her satır bir sonrakinden tek bir yeni satır karakteriyle ayrılır, örneğin:
-----\n \n-----\n \n-----\n \n-----\n \n-----\n
Satırlar keyfi uzunluktadır (programlama diliniz tarafından işlenebilecek makul bir miktarda) ve her satır diğerleriyle aynı uzunluktadır. Ayrıca satırların her zaman üçe bölünebilen bir uzunlukta olacağını unutmayın (bir notun desenini ve ardından iki sütun notsuz olarak sığdırmak için).

Notlar bu personele uygun -veya karakteri değiştirerek yerleştirilir o. Notlar ayrıca bir yarı ton (nota ve bitişik notaları arasındaki frekans farkının yaklaşık yarısı) ile perdede yükseltilebilir (keskin) veya alçaltılabilir (düz). Bu, karakterlerle #ve bsırasıyla yerine gösterilir o. Her not bir sonrakinden tam olarak iki -karakterle ayrılır ve ilk not her zaman -ve (boşluk) karakterlerin ilk "sütununda" yer alır .

Not adlarını çıkarırken, programınız her zaman A B C D E F Gpersonel üzerinde verilen nota karşılık gelen büyük harf ( ) kullanmalıdır . Keskin (For #() ve düz b) notları, program ihtiyaçları eklemek #ve bnota tekabül mektuba sırasıyla. Keskin veya düz olmayan doğal bir not için bunun yerine bir (boşluk) eklenmelidir.

Misal

Giriş:

---------------------Ö--
                  Ö     
---------------Ö--------
            Ö           
--------- b --------------
      Ö                 
---Ö--------------------
Ö                       
------------------------

* Bu örnekteki tüm "boşluk" un aslında (boşluk karakteri) olduğunu unutmayın.
Bu durumda (basit bir F ana ölçeği), programınız bunu çıktılamalıdır:

FGA Bb CDEF

Çıktının karakterleri arasındaki boşluğun, personel üzerindeki notlara tam olarak uyacak şekilde tam olarak yukarıda gösterildiği gibi olması gerektiğini unutmayın. Tüm nota adları arasında iki tane vardır arasına hariç (boşluk) karakterleri, Bbve C. bBurada birini yerine (boşluk) karakterler.

Başka bir örnek
Giriş:

------------------------
                     Ö  
------------------ # -----
               #        
------------Ö-----------
         Ö              
------ # -----------------
   #                    
Ö-----------------------

Çıktı:
E F# G# A B C# D# E

İyi şanslar için bir örnek daha
:

---------------------
oooo           
---------------------
         Ö              
---------------------

--------------- O - O-

---------------------

Çıktı:
E E E C E G G

kurallar

  • Notlar sadece E çizgisine kadar F keskinliğine kadar olan beş satırlık personel aralığında verilecektir (zorluklar hariç, aşağıya bakın)
  • Herhangi bir nota keskin veya düz olabilir, sadece müzikte yaygın olarak görülenler değil (örneğin, B # aslında sadece C olarak gerçekte çalınmasına rağmen, B # girişte hala oluşabilir)
  • Her 3 sütun için tam olarak bir nota olacağını varsayabilirsiniz (bu nedenle akor veya bunun gibi bir şey olmayacak ve dinlenmeyecektir)
  • Son notun ardından notsuz iki sütun geleceğini varsayabilirsiniz.
  • Personelin son satırının bile tek bir yeni satır karakteri geleceğini varsayabilirsiniz.
  • Giriş STDIN'den (veya dil eşdeğerinden) veya işlev parametresi olarak alınmalıdır
  • Çıktı STDOUT (veya dil eşdeğeri) veya programınız bir işlevse dönüş sonucu olarak olmalıdır
  • Standart boşluklara ve gömme deliklere izin verilir! Müzik denemek ve oyun oynamakla ilgilidir. Devam edin ve dilinizle eğlenin (bir boşluktan yararlanmanın en ilginç programı üretmeyebileceğini unutmayın)
  • Bu , bayt en kısa program kazanır

Bonus zorluklar

  • Programınız, personelin en üst satırının üzerindeki alanı (G, G #, Gb) başarıyla işleyebiliyorsa% -10.
  • Programınız personelin alt satırının altındaki alanı da başarıyla işleyebiliyorsa% -10 (D, D #, Db)
  • Bu durumlarda, programınız başlangıç ​​ve bitişte ek bir satır olarak girer; bu satırlar diğer dokuz satırla tamamen aynı şekilde ele alınmalıdır

Evet, birinin soruma oldukça benzediğinin farkındayım. Ancak, bu sadece bir cevap aldı. Daha fazla dili dahil etmek için daha basit bir şey yapmayı umuyordum. Ve aslında, bu zorluğun notları bir personele dönüştürmenin tersini içerdiğine inanıyorum.
MC ΔT

Yanıtlar:


3

CJam ( 40 37 * 0.8 = 29.6 puan)

qN/z3%{_{iD%6>}#_~'H,65>=@@=+'oSerS}%

Çevrimiçi demo

Gerçekten de unutmuş olduğum önceden tanımlanmış bazı değişkenleri işaret ettiğiniz için teşekkürler .


Çok temiz! Boşluk karakterleri için S kullanarak birkaç bayt tıraş edebilirsiniz. Ayrıca, 13'ü D ile değiştirirsiniz.
MC ΔT

1

Yakut, 106 bayt * 0.8 = 84.8

->s{a=' '*l=s.index('
')+1
s.size.times{|i|s[i].ord&34>33&&(a[i%l,2]='GFEDCBA'[i/l%7]+s[i].tr(?o,' '))}
a}

Test programında yönlendirilmemiş

f=->s{a=' '*l=s.index('
')+1                                 #l = length of first row, initialize string a to l spaces
  s.size.times{|i|                   #for each character in s
  s[i].ord&34>33&&                   #if ASCII code for ob#
   (a[i%l,2]=                        #change 2 bytes in a to the following string
   'GFEDCBA'[i/l%7]+s[i].tr(?o,' '))}#note letter, and copy of symbol ob# (transcribe to space if o)
a}                                   #return a



t='                        
---------------------o--
                  o     
---------------o--------
            o           
---------b--------------
      o                 
---o--------------------
o                       
------------------------

'

u='                        
------------------------
                     o  
------------------#-----
               #        
------------o-----------
         o              
------#-----------------
   #                    
o-----------------------

'

v='                     
---------------------
o  o  o     o        
---------------------
         o           
---------------------

---------------o--o--

---------------------

'

puts f[t]
puts f[u]
puts f[v]

1

JavaScript (ES6), 144 bayt -% 20 = 115,2

f=s=>(n=[],l=s.indexOf(`
`)+1,[...s].map((v,i)=>(x=i%l,h=v.match(/[ob#]/),n[x]=h?"GFEDCBAGFED"[i/l|0]:n[x]||" ",h&&v!="o"?n[x+1]=v:0)),n.join``)

açıklama

f=s=>(
  n=[],                      // n = array of note letters
  l=s.indexOf(`
`)+1,                        // l = line length
  [...s].map((v,i)=>(        // iterate through each character
    x=i%l,                   // x = position within current line
    h=v.match(/[ob#]/),      // h = character is note
    n[x]=                    // set current note letter to:
      h?"GFEDCBAGFED"[i/l|0] //     if it is a note, the letter
      :n[x]||" ",            //     if not, the current value or space if null
    h&&v!="o"?n[x+1]=v:0     // put the sharp/flat symbol at the next position
  )),
  n.join``                   // return the note letters as a string
)

Ölçek

Personelin üzerine, diğer hatların tam uzunluğu olan bir çizgi eklemeyi unutmayın, çünkü bu çözüm personelin üstündeki ve altındaki çizgileri ayrıştırmayı içerir.

f=s=>(n=[],l=s.indexOf(`
`)+1,[...s].map((v,i)=>(x=i%l,h=v.match(/[ob#]/),n[x]=h?"GFEDCBAGFED"[i/l|0]:n[x]||" ",h&&v!="o"?n[x+1]=v:0)),n.join``)
<textarea id="input" style="float:left;width:200px;height:175px">                        
---------------------o--
                  o     
---------------o--------
            o           
---------b--------------
      o                 
---o--------------------
o                       
------------------------
                        </textarea>
<div style="float:left">
  <button onclick="results.innerHTML=f(input.value)">Test</button>
  <pre id="results"></pre>
</div>

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.