首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >乐谱解释器

乐谱解释器
EN

Code Golf用户
提问于 2011-07-22 10:12:26
回答 2查看 1.1K关注 0票数 11

给定一个ascii乐谱,您必须能够输出音符及其相应的长度。乐谱将包含5到15个音符,并在音阶上转录。壁由五条水平线组成,由-(减号)字符组成,由空格线隔开。音箱中的底线相当于音符'E‘。底线上方的空格线表示'F',其音高比它下面的'E‘高。这一情况继续如下。注意,在“A”处重新开始之前,音符只会上升到“G”。见下文:

代码语言:javascript
复制
F ----------
E           
D ----------
C           
B ----------
A           
G ----------
F           
E ----------

注意,这些字母不包括在输入中。音符叠加在音箱顶部,使用o(小写)字符来表示“音符头”。这个音符头表示音符的频率,因此它的字母表示如下所示。例如,下面放在分数上的注释表示'A‘:

代码语言:javascript
复制
----

----

----
o   
----

----

一个音符,就像上面的'A‘一样,被称为’整个音符‘,将被演奏一个完整的节拍。其他的持续时间可以通过包括从音符上升的“词干”,以及在零到三个“旗子”之间来表示。阀杆由三个连(管,或垂直条)字符组成,这些字符堆放在音头上方。没有旗子的杆被认为是“四分之一音符”,并演奏四分之一的节拍。标志是\(反斜杠)字符,手在茎的右手边。每个杆把演奏音符的时间减半。每个音符的长度将是以下之一:完整音符、四分之一音符、第八音符、第十六音符或第三十二音符。每种类型的笔记都是这样查找A的:

代码语言:javascript
复制
--------------------

----|---|\--|\--|\--
    |   |   |\  |\
----|---|---|---|\--
o   o   o   o   o
--------------------

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

把一个以上的音符放在一起会给你一个分数。每个音符可以被认为是四个字符宽,一个注释在每个四个字符块的第一列。例如:

代码语言:javascript
复制
    |\             
----|\--|\----------
    |\  |       |\  
----o---|---o---|\--
|       o       |   
|---------------o---
|                   
o-------------------

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

上面的例子按顺序包括以下注释:四分之一音符'G‘、第三十二音符'D’、第八个音符'C‘、整个音符'D’和第十六音符'B‘。输出中的每个音符都应该是格式字母/长度,其中字母是a,长度是音符长度的分数,与整个音符相比。作为例外,如果注释是一个完整的注释,则不应打印长度和/字符。输出中的每个音符都应该用一个空格隔开。因此,对于上面的分数,您的代码应该输出以下内容:

代码语言:javascript
复制
G/4 D/32 C/8 D B/16
  • 注释将在以下范围:e,F,G,A,B,C,D,E,F,注意,只有字母需要打印,八度被忽略。
  • 请注意,输入的行数从9行到12行不等,因为在D行或更高行上有四分之一或更短时间的注释将需要更多的行才能完全显示。
  • 在这种情况下没有半音。

最短代码获胜(空格不算在内)。

编辑:固定错误的间隔在一个输入。

一些样本输入:

代码语言:javascript
复制
        |\                    
----|\--|-------------------
|\  |   |                   
|---|---o---------------o---
|   o               |\      
o---------------|\--|\------
            |\  |\  |\      
------------|\--|\--o-------
            |\  o           
------------o---------------

产出:B/8C/8D/8 E/32 F/32 G/32 D

代码语言:javascript
复制
----------------o-------------------
                                o   
------------o-----------------------
                            o       
--------o---------------------------
                        o           
----o-------------------------------
                    o               
o-----------------------------------

产出:e、G、B、D、F、A、C、E

代码语言:javascript
复制
            |\                  
            |\                  
            |\                  
------------o-------|-----------
|               o   |   |\      
|---|\--------------|---|\------
|   |               o   |\      
o---|---|\--------------o---|\--
    o   |\                  |\  
--------|\------------------|---
        o                   o   
--------------------------------

产出: B/4 A/8 F/32 F/32英C/4 B/32 F/16

EN

回答 2

Code Golf用户

发布于 2011-07-30 15:08:24

J - 108字符

代码语言:javascript
复制
exit echo}.,>,&.>/_4<@((a.{~32,65+7|4+i.&'o'),(>&0#('/',0":2^]))@((+/@(=&'\'))+2*'|'&e.))@;\|:|.[;._2]stdin''

未高尔夫球:

代码语言:javascript
复制
str =: stdin''
lines =: [;._2] str                          NB. split on the last character, the newline
rotated =: |: |. lines                       NB. lines reversed, then transposed
pitch =: 65 + 7 | 4 + i.&'o'                 NB. ord('A') + ( line.index('o') + 4 ) % 7
has_stem =: '|' & e.                         NB. '|' in line?
backslash_count =: (+/ @ (=&'\') )           NB. sum(char = '\\' for char in line)
denom_exp =: backslash_count + 2 * has_stem
fraction =: (>&0 # ('/', 0": 2 ^ ]))         NB. slash + 2^denom_exp, if denom_exp > 0
suffix =: fraction @ denom_exp
note_string =: (a. {~ 32,pitch) , suffix     NB. map(chr, (ord(' '), pitch)) + suffix
boxed_note_string =: < @ note_string @ ;     NB. box the string so it doesn't get padded
each_note_of_the =: boxed_note_string        NB. compute the note for a block of 4 lines
join_to_one_box =: , &. >
exit echo }. , > join_to_one_box / _4 each_note_of_the \ rotated
票数 2
EN

Code Golf用户

发布于 2012-12-05 05:28:12

Python高尔夫,207个字符.

代码语言:javascript
复制
import sys
a=[x[:-1]+' '*99 for x in sys.stdin]
for x in range(0,99,4):
 b=''.join((y[x:x+4] for y in a))+'o'
 c=2**(b.count('\\')+('|'in b)*2)
 print'FEDCBAGFE '[b.index('o')/4-len(a)+9]+('','/'+`c`)[c>1],

我已经用Python编写了两天的代码,我发现像import syssys.stdin.readsys.stdout.write这样的东西是扩展性的。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/3230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档