那是930年,而格里高利教堂遇到了问题。他们有数千页的诵经音乐,但是问题是所有乐谱都被简单地堆放了起来,而不是拥有任何实际的组织系统:
由制图者协会的用户gamerprinter提供。
教堂需要组织所有乐谱,因此他们聘请了一位中世纪软件工程师来编写程序来为他们组织音乐。您是已雇用的软件工程师。但是,中世纪的编译过程需要由一群缓慢的圣经抄写员将程序写在纸上。为了减少抄写员团队编译代码所花费的时间,您必须使程序尽可能小。
教会希望根据他们所写的音阶来组织圣歌。教会的所有圣歌都以多利安音阶来编写。给定特定音乐的音符,您的程序将输出它所在的Dorian音阶。在这里,我将确切解释Dorian音阶是什么。如果您已经知道,则可以跳过本节。
任何旋律中都有12种可能的音符。在这里,它们按顺序排列:
C C# D D# E F F# G G# A A# B
一个半音(用表示S
)正在向右增加一个步骤,环绕(所以从B向上的半音将回到C)。甲色调(使用表示T
)是两个半音。例如,从F#开始的半音为G。从F#开始的半音为G#。
要创建多利安音阶,我们从列表中的任何音符开始,然后按照以下模式向上移动,列出遇到的音符:
T, S, T, T, T, S
一个例子。我从A开始。Dorian音阶的音阶变成:
A
B (up a tone)
C (up a semitone)
D (up a tone)
E (up a tone)
F# (up a tone)
G (up a semitone)
该秤的音符为A,B,C,D,E,F#和G。由于我是从A开始的,因此在A中将其称为Dorian秤。因此,有12种不同的多里安音阶,每种音阶都以它们起初的音符命名。他们每个人都使用相同的色调和半音模式,只是从不同的位置开始。如果我的解释不一致,您也可以查阅Wikipedia。
可以从适合您程序的任何内容(例如STDIN,命令行参数,raw_input()
)中给出程序的输入。它可能没有在变量中预先初始化。输入将是逗号分隔音符列表,代表乐曲的旋律。可能有重复的注释。输入中将始终有足够多的不同音符,以便能够果断地推断出乐曲的音阶。输入示例:
B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
程序的输出应为字符串Dorian scale in X
,其中X是音阶的起始音符。示例输入的输出:
Dorian scale in B
将其与B(B C# D E F# G# A
)中的多利安音阶进行比较,我们看到旋律的所有音符都在该音阶内。在这种情况下,注释C#未使用。但是,有足够的注释可以明确地将B Dorian标识为正确的密钥。没有其他的多利安音阶适合,因为无论我们尝试使用哪种其他音阶,总是至少有一个不属于该音阶的旋律音符。
这是代码高尔夫球,因此字符数最少的条目将获胜。如有疑问,请在评论中提问。