让我们做音乐!


11

许多人喜欢播放音乐来娱乐和娱乐。不幸的是,有时候音乐很难。这就是为什么你在这里!

任务

使那些苦苦挣扎的人更容易阅读音乐是您的工作。您需要编写一个程序或函数,将乐谱作为输入,并输出写在该谱上的音符名称。

员工,谱号和笔记

一个音乐的工作人员,或破碎,是五横,插图中它们是四个空格。每条线或每条空格代表不同的音符(音高),具体取决于谱号。
有几种不同的谱号可供选择,但我们现在只处理一种:高音谱号。在高音谱号上,音符在谱表上的表示方式如下:

线数
F  -  -  -  -  - 
D ----------
B ----------
G  -  -  -  -  - 
E ----------
空间  
   ----------  
Ë
   ----------  
C
   ----------  
一种
   ----------  
F
   ----------

输入格式

输入将作为单个字符串给出,如下所示:

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

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

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

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

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

职员的五行和四个空格由九行字符组成。职员的行用-(连字符)字符构成,空格用(空格)构成。每行与下一行之间用一个换行符隔开,例如:
-----\n \n-----\n \n-----\n \n-----\n \n-----\n
行的长度是任意的(可以由您的编程语言处理的合理数量),并且每行的字符长度与其他行的长度完全相同。还要注意,行的长度总是可以被三整除的(以适应一个音符的样式,然后是两行不带音符的列)。

通过用代替相应的-字符,在此工作人员上放置注释o。也可以通过半音(音符与其相邻音符之间的频率差的一半)在音高上提高(清晰)或降低(平坦)。这将由#b分别代替o。每个音符将与下-一个音符精确地用两个字符隔开,并且第一个音符将始终出现在-(空格)字符的第一个“列”上。

输出便笺名称时,程序应始终使用与谱表上A B C D E F G给定便笺相对应的大写字母()。对于锐(#)和平板(b)的笔记,你的程序需要追加#b,分别对应的说明信。对于不清晰或不平坦的自然音符,应附加一个(空格)。

输入:

--------------------- o--
                  Ø     
--------------- o --------
            Ø           
--------- b --------------
      Ø                 
--- o --------------------
Ø                       
------------------------

*请注意,此示例中的所有“空白”实际上都是(空格字符)。
在这种情况下(简单的F大音阶),您的程序应输出以下内容:

FGA Bb CDEF

请注意,输出字符之间的间距应完全如上所示,以与谱表上的注释正确匹配。在所有音符名称之间,有两个(空格)字符,除了Bb和之间C。在b这里代替的一个(空间)的字符。

另一个示例
输入:

------------------------
                     Ø  
------------------#-----
               #        
------------ o -----------
         Ø              
------#-----------------
   #                    
o -----------------------

输出:
E F# G# A B C# D# E


输入好运的另一个示例:

---------------------
oo           
---------------------
         Ø              
---------------------

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

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

输出:
E E E C E G G

规则

  • 仅在E平至F锐利的五行人员范围内给出注释(挑战除外,请参见下文)
  • 任何音符都可以是尖锐或平坦的,而不仅仅是音乐中常见的音符(例如,尽管实际上B#实际上只是作为C演奏,但B#仍可以出现在输入中)
  • 您可以假设每3列中只有一个音符(因此不会出现和弦或类似的声音,也不会休息)
  • 您可以假设最后一个音符后面将有两列没有音符
  • 您可以假设,即使是工作人员的最后一行,也要跟一个换行符
  • 输入应来自STDIN(或等效语言)或作为功能参数
  • 输出应为STDOUT(或等效语言),如果程序是函数,则应作为返回结果
  • 允许使用标准漏洞和内置插件!音乐是关于实验和演奏的。继续并与您的语言一起玩(尽管认识到利用漏洞可能不会产生最有趣的程序)
  • 这是,因此以字节为单位的最短程序获胜

奖金挑战

  • 如果您的程序还可以成功处理人员顶行(G,G#,Gb)上方的空间,则为-10%。
  • 如果您的程序还可以成功处理人员底线下方的空间(D,D#,Db),则为-10%
  • 在这种情况下,您的程序将在开始和结束处添加另外一行;这些行应与其他九行完全相同

是的,我意识到一个问题与我的问题非常相似。但是,那个人只有一个答案。我希望能使事情变得更简单,以使更多的语言参与其中。实际上,我认为挑战是相反的,将笔记转换成谱。
MCΔT15年

Answers:


3

果酱(40 37 * 0.8 = 29.6分)

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

在线演示

感谢确实指出了一些我忘记了的预定义变量。


井井有条!您可以使用空格字符S来减少一些字节。此外,你D.替换13
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}

取消测试程序

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>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.