มาสร้างเพลงกันเถอะ!


11

ผู้คนจำนวนมากชอบเล่นเพลงเพื่อความสนุกสนานและความบันเทิง น่าเสียดายที่บางครั้งเพลงก็ค่อนข้างยาก นั่นคือเหตุผลที่คุณมาที่นี่!

งาน

เป็นหน้าที่ของคุณที่จะทำให้การอ่านเพลงง่ายขึ้นสำหรับผู้ที่ต้องดิ้นรนกับมัน คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นที่ทำหน้าที่เป็นเจ้าหน้าที่ดนตรีและป้อนชื่อของบันทึกที่เขียนบนพนักงานนั้น

พนักงานโน๊ตและโน้ต

พนักงานดนตรีหรือไม้เท้าเป็นห้าเส้นแนวนอน inbetween ซึ่งเป็นสี่ช่องว่าง แต่ละบรรทัดหรือช่องว่างหมายถึงบันทึกย่อที่แตกต่างกัน (ระยะห่าง) ขึ้นอยู่กับโน๊ต
มีความยุติธรรมไม่กี่ Clefs ดนตรีที่แตกต่างกันเพื่อเลือกจากเราจะได้รับการจัดการกับหนึ่งสำหรับตอนนี้มี แต่ที่: โน๊ตสาม บนโน๊ตเสียงแหลมโน้ตจะถูกนำไปแสดงต่อพนักงานดังนี้:

เส้น
ฉ ----------
D ----------
B ----------
G ----------
E ----------
ช่องว่าง  
   ----------  
E
   ----------  
ค
   ----------  

   ----------  
F
   ----------

การจัดรูปแบบของอินพุต

อินพุตจะถูกกำหนดเป็นสตริงเดี่ยวดังนี้:

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

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

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

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

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

ห้าบรรทัดและสี่ช่องว่างของพนักงานสร้างจากอักขระเก้าแถว เส้นของพนักงานถูกสร้างด้วย-อักขระ (เครื่องหมายขีดคั่น) และช่องว่างที่มี(ช่องว่าง) แต่ละแถวจะถูกแยกออกจากบรรทัดถัดไปด้วยอักขระบรรทัดเดียวเช่น:
-----\n \n-----\n \n-----\n \n-----\n \n-----\n
แถวมีความยาวตามอำเภอใจ (เป็นจำนวนที่เหมาะสมที่สามารถจัดการได้โดยภาษาการเขียนโปรแกรมของคุณ) และแต่ละแถวมีความยาวเท่ากันในตัวอักษรเหมือนกับแถวอื่น นอกจากนี้โปรดทราบว่าแถวจะมีความยาวที่หารด้วยสามได้เสมอ (เพื่อให้พอดีกับรูปแบบของโน้ตหนึ่งตามด้วยสองคอลัมน์โดยไม่มีโน้ต)

หมายเหตุจะอยู่ในทีมนี้โดยการแทนที่เหมาะสม-หรือตัวละครด้วย oโน้ตยังสามารถยก (คม) หรือลดลง (แบน) ในระดับเสียงโดย semitone (ประมาณครึ่งหนึ่งของความแตกต่างความถี่ระหว่างโน้ตและโน้ตที่อยู่ติดกัน) นี้จะถูกแทนด้วยตัวอักษร#และตามลำดับในสถานที่ของb oแต่ละโน้ตจะถูกแยกออกจาก-ตัวอักษรถัดไปโดยมีอักขระสองตัวและโน้ตแรกจะเกิดขึ้นเสมอใน "คอลัมน์" แรกของตัวอักษร-และ(เว้นวรรค)

เมื่อแสดงชื่อโน้ตโปรแกรมของคุณควรใช้ตัวพิมพ์ใหญ่ ( A B C D E F G) ที่ตรงกับบันทึกที่ให้ไว้กับเจ้าหน้าที่ สำหรับบันทึกย่อที่แหลม ( #) และแบน ( b) โปรแกรมของคุณต้องผนวก#และbตามลำดับตัวอักษรที่สอดคล้องกับบันทึกย่อ สำหรับโน้ตธรรมชาติที่ไม่แหลมหรือแบนควรเพิ่ม (เว้นวรรค) แทน

ตัวอย่าง

การป้อนข้อมูล:

--------------------- o--
                  โอ     
--------------- o --------
            โอ           
--------- ข --------------
      โอ                 
--- o --------------------
โอ                       
------------------------

* หมายเหตุ "พื้นที่ว่าง" ทั้งหมดในตัวอย่างนี้เป็นจริง(อักขระเว้นวรรค)
ในกรณีนี้ (สเกลเมเจอร์ F แบบง่าย) โปรแกรมของคุณควรแสดงผลลัพธ์ดังนี้:

FGA Bb CDEF

หมายเหตุระยะห่างระหว่างตัวอักษรของเอาต์พุตควรตรงตามที่แสดงด้านบนเพื่อให้พอดีกับโน้ตบนเจ้าหน้าที่ ระหว่างทั้งชื่อทราบมีสอง(เว้นวรรค) ตัวละครยกเว้นระหว่างและBb นี่แทนที่หนึ่งในตัวละคร (เว้นวรรค) Cb

อีกตัวอย่างหนึ่ง
อินพุต:

------------------------
                     โอ  
------------------ # -----
               #        
------------ o -----------
         โอ              
------ # -----------------
   #                    
o -----------------------

เอาท์พุท:
E F# G# A B C# D# E

อีกตัวอย่างหนึ่งสำหรับความโชคดี
อินพุต:

---------------------
oooo           
---------------------
         โอ              
---------------------

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

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

เอาท์พุท:
E E E C E G G

กฎระเบียบ

  • หมายเหตุจะถูกมอบให้เฉพาะในกลุ่มพนักงานห้าสายของ E ที่มีขนาดแบนจนถึง F ที่คมชัด (ยกเว้นความท้าทาย, ดูด้านล่าง)
  • หมายเหตุใด ๆ อาจคมชัดหรือแบนไม่เพียง แต่เห็นได้ทั่วไปในเพลง (เช่นแม้ว่า B # จริง ๆ แล้วเพิ่งเล่นเป็น C ในความเป็นจริง B # ยังสามารถเกิดขึ้นได้ในอินพุต)
  • คุณสามารถสันนิษฐานได้ว่าจะมีบันทึกย่อหนึ่งรายการต่อ 3 คอลัมน์ (ดังนั้นจะไม่มีคอร์ดหรืออะไรทำนองนั้นและไม่มีการพัก)
  • คุณสามารถสมมติว่าบันทึกสุดท้ายจะตามด้วยสองคอลัมน์โดยไม่มีหมายเหตุ
  • คุณสามารถสันนิษฐานได้ว่าบรรทัดสุดท้ายของพนักงานจะตามด้วยอักขระขึ้นบรรทัดใหม่
  • อินพุตควรถูกนำมาจาก STDIN (หรือเทียบเท่าภาษา) หรือเป็นพารามิเตอร์ของฟังก์ชัน
  • เอาต์พุตควรเป็น STDOUT (หรือเทียบเท่าภาษา) หรือเป็นผลลัพธ์ส่งคืนหากโปรแกรมของคุณเป็นฟังก์ชัน
  • อนุญาตให้มีช่องโหว่มาตรฐานและบิวด์อินได้! ดนตรีเป็นเรื่องเกี่ยวกับการทดลองและเล่น ไปข้างหน้าและสนุกกับภาษาของคุณ (แม้ว่าจะจำได้ว่าการใช้ช่องโหว่อาจไม่ทำให้โปรแกรมที่น่าสนใจที่สุด)
  • นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ

ความท้าทายของโบนัส

  • -10% ถ้าโปรแกรมของคุณสามารถประมวลผลพื้นที่ด้านบนของพนักงาน (G, G #, Gb) ได้สำเร็จ
  • -10% ถ้าโปรแกรมของคุณสามารถประมวลผลพื้นที่ด้านล่างบรรทัดล่างของพนักงานได้สำเร็จ (D, D #, Db)
  • ในกรณีเหล่านี้โปรแกรมของคุณจะรับข้อมูลเข้าเป็นแถวเพิ่มเติมเมื่อเริ่มต้นและสิ้นสุด แถวเหล่านี้ควรได้รับการปฏิบัติเหมือนกันกับอีกเก้าแถว

ใช่ฉันรู้ว่าคำถามหนึ่งค่อนข้างคล้ายกับคำถามของฉัน อย่างไรก็ตามคำตอบนั้นได้คำตอบเดียวเท่านั้น ฉันหวังว่าจะทำให้บางอย่างง่ายขึ้นเพื่อให้มีภาษามากขึ้น และที่จริงแล้วฉันเชื่อว่าความท้าทายนั้นเกี่ยวข้องกับสิ่งที่ตรงกันข้าม
MC ΔT

คำตอบ:


3

CJam ( 40 37 * 0.8 = 29.6 คะแนน)

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

การสาธิตออนไลน์

ขอบคุณจริงๆที่ชี้ให้เห็นตัวแปรที่กำหนดไว้ล่วงหน้าบางอย่างที่ฉันลืม


เรียบร้อยมาก! คุณสามารถโกนหนวดได้สองสามไบต์โดยใช้ S สำหรับอักขระเว้นวรรค นอกจากนี้คุณแทนที่ 13 ด้วย D.
MC ΔT

1

Ruby, 106 ไบต์ * 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}

Ungolfed ในโปรแกรมทดสอบ

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 ไบต์ - 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``)

คำอธิบาย

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
)

ทดสอบ

อย่าลืมเพิ่มสายเหนือพนักงานที่มีความยาวที่แน่นอนของสายอื่น ๆ เพราะวิธีนี้รวมถึงการแยกบรรทัดด้านบนและด้านล่างพนักงาน

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>

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