音乐:这个和弦的名字是什么?


9

这是音乐的反面:这个和弦是什么?,即按给定的和弦打印音符。这次输入的是和弦中的音符列表,您的任务是输出它是哪个和弦。

您的程序应支持以下三重和弦。例子以C为根。其他根的和弦是相同的和弦,所有音符都旋转,因此C将成为该根音,例如Dmaj由D,F#和A组成。

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
Cmaj    C       E     G
Cm      C     D#      G
Caug    C       E       G#
Cdim    C     D#    F#
Csus4   C         F   G
Csus2   C   D         G

请注意,Caug与Eaug和G#aug相同,而Csus4与Fsus2相同。您可以输出其中之一,但如果全部输出,则有额外的好处。

下表列出了奖金的第七和弦:

        C C#D D#E F F#G G#A A#B
          Db  Eb    Gb  Ab  Bb
C7      C       E     G     A#
Cm7     C     D#      G     A#
Cmmaj7  C     D#      G       B
Cmaj7   C       E     G       B
Caug7   C       E       G#  A#
Cdim7   C     D#    F#    A

规则

  • 您可以编写完整的程序或函数。
  • 输入内容是注释列表,以空格或其他方便的字符分隔。它也可以是字符串数组(如果从函数参数中获取输入)或该数组的字符串表示形式。
  • 输入不必按特定顺序进行。
  • 输入中可能有重复的注释。必须像对待其中只有一个一样对待它们。
  • 输出是和弦的名称。如果将输出多个名称,则适用相同的输入规则。
  • 如果输入不是受支持的和弦,则应按原样打印笔记。您的程序还可以支持上表中未列出的其他和弦(有效,但没有奖金)。
  • 您可以使用Wikipedia文章中列出的其他符号。但是,如果选择CC大调,则无论哪种情况都应添加可读的前缀,以区分带有单个音符的和弦。
  • 您不能将内置功能用于此任务(如果有)。
  • 这是代码高尔夫球。以字节为单位的最短代码获胜。

例子

  • 输入:C D# G输出:Cm
  • 输入:C Eb G输出:Cm
  • 输入:C Eb F#输出:Cdim
  • 输入:F A C#输出:FaugAaugC#augDbaug或者Faug Aaug C#augFaug Aaug Dbaug以任何顺序。
  • 输入:F D F F F F A A F输出:Dm
  • 输入:C D输出:C D

奖金

  • 如果有多个解释(对于aug,sus4 / sus2和dim7),则如果打印全部,则返回-30。
  • -70如果还支持第七和弦。
  • -200如果接受MIDI输入并打印接收到的每个和弦。请注意,注释不必同时开始或结束。您可以决定在中间状态下会发生什么(只要它不会崩溃或停止工作)。您可以假设打击乐通道中没有音符(或者如果方便的话,只有一个通道)。建议还提供文本(或数组)版本进行测试,尤其是与平台相关的版本。

输入的内容可以是平坦的还是仅使用锐利的?是否应处理B#之类的注释?
feersum'1

@feersum它可以有单位(除非您要求获得-200奖金)。添加了一些示例。你并不需要处理B#Cb等等
jimmy23013

你说Csus4 is the same as Gsus2。我想你的意思Csus2 is the same as Gsus4不是吗?
Gareth 2015年

@Gareth ...是的。固定。
jimmy23013 2015年

Answers:


2

Pyth 190个字符-30-70 = 90

=Q{cQdL+x"C D EF G A B"hb&tlbt%hx" #b"eb3FZQJx[188 212 199 213 200 224 2555 2411 2412 2556 2567 2398)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 maj dim aug m sus4 7 m7 mmaj7 maj7 aug7 dim7"dJ=T0;ITQ

对此不是很满意。使用了硬编码的和弦。

用法:

在这里尝试:Pyth编译器/执行器。禁用调试模式并"C D# G"用作输入。

说明:

首先做一些准备:

=Q{cQd
   cQd  split chord into notes "C D# G" -> ["C", "D#", "G"]
  {     set (eliminate duplicates)
=Q      Q = ...

然后是一个将笔记转换为整数的函数

L+x"C D EF G A B"hb&tlbt%hx" #b"eb3
defines a function g(b),
  returns the sum of 
     index of "D" in "C D EF G A B"
     and the index of "#" in " #b" 
       (if b than use -1 instead of 2)

然后针对每个音符,移动坐标并在表格中查找

FZQJx[188 ...)u+*G12hHSm%-dyZ12mykQ0IhJ+Z@c"sus2 ..."dJ=T0;ITQ
               implicit T=10
FZQ            for note Z in chord Q:
   mykQ         map each note of Q to it's integer value
   m%-dyZ12     shift it by the integer value of Z modulo 12 
   S            sort it
   u+*G12hH 0   convert it to an integer in base 12
   x[188 ...)   look it up in the list (-1 if not in list)
   J            and store the value in J

   IhJ               if J>=0:
   +Z@c"sus2 ..."dJ   print the note Z and the chord in the list
=T0                   and set T=0
;            end loop
ITQ          if T:print chord (chord not in list)

2

Perl 5:183-100 = 83

编辑:我设法削减了一些额外的字符,所以我也像在Python解决方案中一样更改了和弦名称,所以我可以假装自己领先。

#!perl -pa
for$z(0..11){$x=0;$x|=1<<((/#/-/b/+$z+1.61*ord)%12or$o=$_)for@F;$x-/\d+_?/-$_*4||push@r,$o.$'
for qw(36M 34- 68+ 18o 40sus2 33sus4 292_7 290-7 546-M7 548M7 324+7 146o7)}$_="@r
"if@r

例:

$ perl chord.pl <<<"C D# G"
C-

0

Python 2,335字节-30-70 = 235

首先尝试稍长一点的高尔夫,所以我可能会错过一些明显的花样。

def f(s,N="C D EF G A B",r=range,u=1):
 for i in r(12):
  for t in r(12):
   if(set((N.find(n[0])+" #".find(n[1:]))%12for n in s.split())==set(map(lambda n:(int(n,16)+i)%12,"0"+"47037048036057027047A37A37B47B48A369"[3*t:3*t+3]))):print(N[i],N[i+1]+"b")[N[i]==" "]+"M - + o sus4 sus2 7 -7 -M7 M7 +7 o7".split()[t];u=0
 if(u):print s

注释:

  • 我使用了Wiki页面上的替代和弦名称(请参见长行的末尾)以节省空间。
  • 每个和弦都由3个十六进制偏移量表示(不要求0,但对于三重音则包括在内,以使它们对齐)。
  • “#”。find(n [1:])有效,因为“#”。find(“ b”)为-1,而“#”。find(“””)为0。

样品输出

>>> f("C D# G")
C-
>>> f("C Eb G")
C-
>>> f("C Eb F#")
Co
>>> f("F A C#")
Db+
F+
A+
>>> f("F D F F F F A A F")
D-
>>> f("C D")
C D
>>> f("C Eb Gb A")
Co7
Ebo7
Gbo7
Ao7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.