先提取首字母并排序,一般情况下最小的字母就是根音的字母,涉及到经过G又回到A的例外情况有四种,通过字典q将这四种例外映射到正确的排序。
提取首字母的同时用字典b记录首字母和音符的对应关系,据此输出根音。
用匿名函数h通过字符串查找计算音级。
设三个音级分别是XYZ,亦即Y-X和Z-Y分别有(3,3)、(3,4)、(4,3)、(4,4)这四种情况,简单尝试可以发现3Y-2Z-X+5模12是这四组数对到0123的单射,将之视作字符串“m+° ”的下标即可输出类型。
最终代码有四行。
代码长度:283字节 vs. 全站第一:127字节。
注:本题的难度来自理解题意和设计判断三和弦类型的哈希函数。
import sys
h=lambda x:'A-BC-D-EF-G'.find(x[0])+{'♯':1,'♭':-1}.get(x[-1],0)
q={'ADF':'DFA','BEG':'EGB','ACF':'FAC','BDG':'GBD'}
for a in sys.argv[1:]:b={i[0]:i for i in a.split()};c=''.join(sorted(b.keys()));x,y,z=q.get(c,c);print(b[x]+'m+° '[(3*h(b[y])-2*h(b[z])-h(b[x])+5)%12])
|