在弹钢琴的时候,我意识到要正确地弹奏和弦,我通常需要记住和弦的哪个音调是白色的,哪个是黑色的。其余的通常由“自动驾驶仪”处理。
让我们编写一个给定第七和弦的程序,它输出在黑色(字符^)和白键(字符-)上播放的音调。每个和弦名称都有一个根,它是大写字母A to G,可选地后面跟着b或#,然后再加上其类型,如下所示。所有第七和弦都包含四个音符,公式用整数表示。
7优势(0,4,7,10)M7专业(0,4,7,11)m7未成年人(0,3,7,10)dim7减少(0,3,6,9)m7b5半减(0,3,6,10)-M7未成年人/专业(0,3,7,11)整数表示法意味着你必须播放四个音符,这四个音符是(w,x,y,z)。(w是根,因此总是零。)
例如,对于输入Bb-M7,输出将是^^-- (对应于Bb)。
程序要么读取chord表单stdin并将结果输出到stdout,要么它应该是一个接受字符串并返回字符串的函数。
发布于 2015-02-06 17:56:50
string f(string p){var x=new Dictionary<char,int>{{'C',1},{'D',3},{'E',5},{'F',6},{'G',8},{'A',10},{'B',12}};var y=new Dictionary<string,string>{{"7","0,4,7,10"},{"M7","0,4,7,11"},{"m7","0,3,7,10"},{"dim7","0,3,6,9"},{"m7b5","0,3,6,10"},{"-M7","0,3,7,11"}};var m="--^-^--^-^-^-";var r="";int j=1,i=0,k=0;if(p[1]=='b')i--;if(p[1]=='#')i++;if(i!=0)j=2;i=i+x[p[0]];var a=y[p.Substring(j)].Split(new char[]{','});for(;k<a.Length;k++)r+=m[(int.Parse(a[k])+i)%12];return r;}对我来说没问题。我测试了它,但谁知道;)
我也认为这是因为
Bb-M7你应该去
^^--发布于 2015-02-07 05:14:01
f[s_]:=StringJoin[Mod[#3+#1+Switch[#2,"",0,"b",-1,"#",1],12]&@@StringSplit[s,Join[Thread@Rule[Characters["C D EF G A B"],Range[0,11]],{"7"->{0,4,7,10},"M7"->{0,4,7,11},"m7"->"0,3,7,10","dim7"->{0,3,6,9},"m7b5"->{0,3,6,10},"-M7"->{0,3,7,11}}]]/.Thread@Rule[Range[0,11],Characters["-^-^--^-^-^-"]]]对于Cdim7 (<-我最喜欢的一个)
In:= f["Cdim7"]
Out= -^^-发布于 2015-02-07 18:43:59
String j(String s){int i=2,t=0,x=s.charAt(0)*2-128,c=s.charAt(1);x-=x/6+(c==98?1:c==35?-1:(i=1)-1);while(i<s.length())t+=s.charAt(i++);int[]a={0,t%11>0?3:4,t%9>0?7:6,(t%9-t%5)/3+10};s="";for(i=0;i<4;)s+=(1717&1<<(x+a[i++])%12)>0?"-":"^";return s;}基本上是我的CJam解决方案的翻译:)
格式更好的可执行程序:
public class J {
String j(String s) {
int i = 2, t = 0, x = s.charAt(0) * 2 - 128, c = s.charAt(1);
x -= x / 6 + (c == 98 ? 1 : c == 35 ? -1 : (i = 1) - 1);
while (i < s.length())
t += s.charAt(i++);
int[] a = { 0, t % 11 > 0 ? 3 : 4, t % 9 > 0 ? 7 : 6, (t % 9 - t % 5) / 3 + 10 };
s = "";
for (i = 0; i < 4;)
s += (1717 & 1 << (x + a[i++]) % 12) > 0 ? "-" : "^";
return s;
}
public static void main(final String... args) {
System.out.println(new J().j("D#m7"));
}
}输出:
^^^^https://codegolf.stackexchange.com/questions/45415
复制相似问题