给定两个音符名称,您将编写一个程序来确定这两个音符形成的间隔是辅音还是不谐音。
介绍
在西方音乐中,只有12种“不同”的音调。它们的名称(从最低到最高)是:C, C#, D, D#, E, F, F#, G, G#, A, A#, B
。该序列是循环的,即,它C
在之后B
无限地继续。
两个音调之间的距离称为间隔。上一个系列(例如C — C#
或E — F
)中相邻的两个音符之间的间隔称为半音。距离较远的音符之间的间隔定义为从第一音调到第二音调所需的半音步数(同时可能环绕序列)。一些示例:D to E
= 2个半音,C to G
= 7个半音,B to D#
= 4个半音(这环绕序列)。1个
现在,这些间隔分为两类:辅音(如果同时演奏两个音符,听起来会很悦耳)和不谐音(不是那么多)。
让我们将辅音间隔定义为:0、3、4、5、7、8和9个半音。
它们的其余部分是不和谐的,即:1、2、6、10和11个半音。
挑战
编写一个“程序”(通常在广义上来说:函数完全可以)执行以下操作:
以两个音符名称(上述序列中的字符串)为输入。您可以按照自己的喜好选择它们(从stdin作为参数,用任何想要的分隔,甚至可以随意将它们作为字符列表(例如
["C","#"]
)。但是,您不能为音符分配任何其他名称(尤其是您可能不会将它们从0编号到11,并使用数字)。对于在那里的音乐极客,音符将不指定八度。在这种情况下,纸币以什么顺序排列,哪个较低和哪个较高也无关紧要。最后,您不需要处理不在上面列表中的任何名称。没有其他类似的谐波
E#
,没有单位,没有双重变化等等。选择任意两个不同的值。只要输入中两个音符形成的间隔是辅音,您的程序就必须输出其中一个,否则输出另一个。(如果需要,可以是
True
和False
,但也可以是π和e :)这是一个代码高尔夫球。每种语言中以字节为单位的最短程序获胜。玩得开心!
示例和测试用例
Note 1 Note 2 Output Interval [semitones]
C D Dissonant 2
A# A# Consonant 0
G D Consonant 7 (wraparound)
D# A Dissonant 6
F E Dissonant 11
A C Consonant 3
我没有添加更多的内容,因为在这种情况下没有特别危险的情况。
这是我的第一个挑战,因此热烈欢迎任何建设性的批评:-)。如果您发现理论解释草率,请随时提出问题。最后,请不要告诉我这是this或this的重复。我确定不是。(后者非常相似,但更为复杂。我认为提出一些简单的挑战将使人们更容易加入。)
1:我尽力简化了这种解释。关于间隔的理论很多。请不要因为把它遗忘而ash我。