首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >音乐:这个和弦叫什么名字?

音乐:这个和弦叫什么名字?
EN

Code Golf用户
提问于 2015-01-07 16:04:28
回答 2查看 685关注 0票数 11

这与音乐:这和弦里有什么?相反,它是在给定的和弦中打印音符。这一次输入是一个和弦中的音符列表,你的任务是输出它是哪一个和弦。

您的程序应该支持以下三进和弦。用根C给出例子。与其他根的和弦是相同的和弦,所有的音都是旋转的,所以C将成为那个根音,例如Dmaj由D,F#和A组成。

代码语言:javascript
复制
        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相同。你可以输出任何一个,但是如果你把它们全部输出,就会有一个额外的结果。

奖金的第七和弦列于下表:

代码语言:javascript
复制
        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

规则

  • 您可以编写完整的程序或函数。
  • 输入是一个注释列表,由空格或其他方便的字符分隔。它也可以是字符串数组(如果它从函数参数中获取输入)或此类数组的字符串表示形式。
  • 输入不一定要按特定顺序排列。
  • 输入中可能有重复的音符。他们必须得到同样的待遇,因为他们只有一个。
  • 输出是和弦的名称。如果它将输出多个名称,则适用相同的输入规则。
  • 如果输入不是一个支持的和弦,你应该按-原样打印笔记。您的程序还可以支持上表中未列出的其他和弦(这是有效的,但没有奖励)。
  • 您可以使用维基百科文章中列出的其他符号维基百科文章中列出的其他符号。但是,如果您选择C作为C大调,您应该在这两种情况下都添加一个人类可读的前缀,以区分单个音符的和弦。
  • 您不能将内置函数用于此任务(如果有)。
  • 这是暗号高尔夫。以字节为单位的最短代码获胜。

示例

  • 输入:C D# G输出:Cm
  • 输入:C Eb G输出:Cm
  • 输入:C Eb F#输出:Cdim
  • 输入:F A C#输出:FaugAaugC#augDbaugFaug Aaug C#augFaug Aaug Dbaug按任何顺序排列。
  • 输入:F D F F F F A A F输出:Dm
  • 输入:C D输出:C D

奖金

  • -30如果有一种以上的解释,则全部打印出来(用于8月、sus2 4/sus2 2和dim7)。
  • -70,如果它也支持第七和弦。
  • -200如果它接受MIDI输入并打印它收到的每个和弦。请注意,注释不必同时开始或结束。您决定在中间状态发生什么(只要它不崩溃或停止工作)。你可能会假设打击乐通道中没有音符(或者如果方便的话只有一个音阶)。建议还提供文本(或数组)版本进行测试,特别是在平台依赖的情况下。
EN

回答 2

Code Golf用户

发布于 2015-01-08 00:26:04

Pyth190个字符- 30 - 70 = 90

代码语言:javascript
复制
=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"作为输入。

解释:

首先是一些准备工作:

代码语言:javascript
复制
=Q{cQd
   cQd  split chord into notes "C D# G" -> ["C", "D#", "G"]
  {     set (eliminate duplicates)
=Q      Q = ...

然后,将注释转换为整数的函数。

代码语言:javascript
复制
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)

然后,对每个音符,移动coord并在一张表中查找它。

代码语言:javascript
复制
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
EN

Code Golf用户

发布于 2015-01-08 14:27:25

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

第一次尝试一个稍长一点的高尔夫,所以我可能错过了一些明显的技巧。

代码语言:javascript
复制
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页面中的其他chord名称(请参阅长行的末尾)来节省空间。
  • 和弦由三个六角偏移表示(不需要0,但三合会包括在内)。
  • “#".find(n1:)工作,因为”#".find("b")是-1,“#".find("")是0。

样本输出

代码语言:javascript
复制
>>> 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
票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/44310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档