音乐:这和弦里有什么?


38

输入值

任何三合会和弦的符号(请参阅http://en.wikipedia.org/wiki/Chord_(music)#Triads)。

输出量

组成给定和弦的音符。

例子

输入:AM 输出:A C# E

输入:C#m 输出:C# E G#

输入:Db+ 输出:C# F A

输入:C0 输出:C D# F#

奖金

-50如果您也可以应付第七和弦

-150用于实际演奏和弦的声音

-150用于使用可打印字符显示如何在钢琴上弹奏和弦;例如AM

┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│  │  │  │  │  ┃  ┃  │  │  ┃  ┃  │  │  │  │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘

-100用于使用可打印字符来显示如何弹奏吉他的和弦;例如AM

x   o   o   o   o   o
┌───┬───┬───┬───┬───┐
│   │   │   │   │   │
├───┼───┼───┼───┼───┤
│   │   │   │   │   │
├───┼───┼───┼───┼───┤
│   │   █   █   █   │
├───┼───┼───┼───┼───┤
│   │   │   │   │   │

(请参阅https://en.wikipedia.org/wiki/Box-drawing_character

规则

  • 结果必须是命令行程序或脚本。

  • 输入和输出可以采用任何形式,只要它遵循音乐符号标准即可。

  • 仅当吉他或钢琴包含三个(三重音)或四个(第七个)必需音符且没有其他音符时,才视为有效。同一音符可以在和弦中出现几次。

  • 不允许使用外部库,除了声音生成(在这种情况下#includeimport... ...指令不会添加到字符计数中)。

  • 这是代码高尔夫球,最短的代码获胜!

音乐理论的一点点...

在现代西方音调音乐中,每个八度音阶由十二个连续音符组成,通常被记为:

A A# B C C# D D# E F F# G G#

要么:

La La# Si Do Do# Re Re# Mi Fa Fa# Sol Sol#

在此系统中,我们认为两个连续的音符(例如AA#,或EF)被一个半音分隔。而且,这些注释有点“循环”:紧随其后的G#A

音高星座

一个和弦由几个(2、3、4,有时更多)音符组成,表示“一起听起来不错”。例如,三和弦包含三个不同的音符,第七和弦包含四个不同的音符。

让我们将四个三和弦定义为:

  • 大三重奏:包含和弦的根(在本问题中为输入的音符),根的大三分(比根高4个半音)和根的完美五分(比根高7个半音) ); 这可以表示为0-4-7

  • 小三合会,象征0-3-7

  • 增强三合会,符号为0-4-8

  • 减少的三合会,象征0-3-6

音高星座:三合会

因此,举例来说,如果你想使一个C大调黑社会指出CCMCmaj,你将需要三个注意:

  • 0:,在这种情况下是aC
  • 4:小三分,比根高4个半音;那是E
  • 7:完美的第五个,比根音高7个半音:aG

这是什么0-4-70-3-70-4-80-3-6使用上述平均值的符号!对于第七和弦,请使用以下模式:

音高变化:第七和弦

今天就这样!现在,用惊人的代码让我惊奇...如果您有任何问题,请在下面添加一些注释。


1
对于非音乐家,可能值得添加一个解释,其中包括整数符号的和弦公式。整数表示法以半音为单位。大和弦(示例AM):0,4,7。小和弦(例如C#m):0,3,7。C减小了(示例Co,或您称为C0)0,3,6(请注意,正确的表示形式是C Eb Gb,但是对于这一挑战,我想我们可以假定this和CD#F#都是可以接受的。)对于增强和弦(示例Db +)为0,4,8,您的示例是错误的,因为它甚至不包含Db。如所写,它是一个B +,相当于D#+或G +
Level River St

3
同样,对于相同类型的所有吉他和弦,禁止使用相同的和弦形状,将导致最短的代码。因此Ab将成为第11品格禁止的A形。可以放一个数字吗?还是我们必须抽11个琴格?总而言之,有很多事情要考虑。您可能要简化奖金。
级圣河

1
嗯..您的增强和弦仍然错误。C#是等音为DB,但Db+就是Db F A没有d#或有-G。这可能是理论上比必要的多一点,公式是重要的部分。如果您确实要包括Wikipedia中列出的所有第七和弦,则应指定输入。我认为钢琴和吉他的ascii输出是灵活的。
级圣河

3
我觉得我比从课程中学到了更多关于音乐理论的知识。
凯文·埃文斯

4
这个网站上最酷的问题!
2014年

Answers:


5

英国广播公司

bbcbasic.co.uk上的仿真器

版本1,340-150键盘-150演奏= 40

这是最新版本,在其中我设法包括以下增强功能,同时又增加了几个字符。

在按回车键之前,可以在屏幕上舒适地编辑输入(我之前使用GET $来获得单个按键,因为BBC Basic不允许您从字符串中访问单个字符,就好像该字符串是数组一样。现在我使用笨重的MID $函数从字符串中提取一个字符的字符串。

显示键盘的两侧以及E和F之间的实线。

为了补偿上述添加的字符,我重新安排了程序以消除不必要的打印语句,并删除了一些乍看上去似乎无法删除的空白。在BBC Basic中,所有内置函数都是保留字,您可以在变量名前放置一个变量名,中间不要留空格。变量名不允许以保留字开头。为了使程序更易于阅读,我将所有变量都更改为小写。

尽管演示看起来好多了,但以下程序实际上已经完全投入使用。(请参见下面的更正。)通常,换行符和冒号是可互换的,除非使用IF语句。在那种情况下,同一行上的所有语句(用冒号分隔)都将有条件地执行。换行符之后的语句不受IF的控制,将始终执行。

程序修订版1340个字符

  a$="C#D#EF#G#A#B0Mm+"
  INPUTx$
  r=INSTR(a$,LEFT$(x$,1))-1
  c=INSTR(a$,MID$(x$,2,1))
  IFc=2c=INSTR(a$,MID$(x$,3)):r=r+1
  t=(r+4-c MOD2)MOD12
  f=(r+c DIV2)MOD12
  v=1
  FORn=-1TO11
  c=1-(n<0ORn=4ORn=11)*5
  b$=MID$(a$,n+1,1)
  IFb$="#"c=11:b$=MID$(a$,n,1)+b$
  c$=MID$("   _______--|__",c,5)
  IFr=n ORt=n ORf=n c$=c$+b$:SOUNDv,-15,100+n*4,99:v=v+1
  PRINTc$
  NEXT

更正:RT Russell的Windows BBC BASIC允许您消除一些换行符和冒号,使总数降至327,请参见下文。此外,它还会在保存之前将关键字标记为单个字符,从而将其降至279个。

  a$="C#D#EF#G#A#B0Mm+"INPUTx$
  r=INSTR(a$,LEFT$(x$,1))-1c=INSTR(a$,MID$(x$,2,1))IFc=2c=INSTR(a$,MID$(x$,3))r=r+1
  t=(r+4-c MOD2)MOD12f=(r+c DIV2)MOD12v=1FORn=-1TO11c=1-(n<0ORn=4ORn=11)*5b$=MID$(a$,n+1,1)IFb$="#"c=11b$=MID$(a$,n,1)+b$
  c$=MID$("   _______--|__",c,5)IFr=n ORt=n ORf=n c$=c$+b$SOUNDv,-15,100+n*4,99v=v+1
  PRINTc$
  NEXT

输出转速1

在此处输入图片说明

Rev 0,337-150键盘-150演奏= 37

A$="C#D#EF#G#A#B0Mm+":X$=GET$:R=INSTR(A$,X$)-1:X$=GET$:IF X$="#"R=R+1:X$=GET$
C=INSTR(A$,X$):T=(R+4-C MOD2)MOD12:F=(R+C DIV2)MOD12:V=1:PRINT"______"
FORN=0 TO 11
C=1-(N=4)*12:B$=MID$(A$,N+1,1): IF B$="#" C=7: B$=MID$(A$,N,1)+B$
PRINT MID$("    __---|________",C,6);:IF(R-N)*(T-N)*(F-N)=0 PRINT B$;:SOUND V,-15,100+N*4,99:V=V+1
PRINT
NEXT

这与我的Arduino回答类似,但是我一直知道我可以用BBC basic击败该字节数。仅识别尖锐字符,但认为B#无效,必须放置C。如果确实认为它很重要,则可以解决此问题。

我放弃了吉他的想法,而专注于改进键盘。现在它从C到B运行,我在键盘的左侧以及E和F之间的行中添加了该字符。该字符的长度为28个字符。右侧不会更多。

这是一些示例输出,一个A#和弦减小(在此反转中具有非常怪异的声音)和一个B大和弦。注意输入不会回显到屏幕上。按照Arduino的答案,逆时针旋转屏幕进行查看。

在此处输入图片说明

非高尔夫版本

A$="C#D#EF#G#A#B0Mm+"                              :REM Note names and chord type names fit very conveniently in the same string.
X$=GET$                                            :REM Get a character 
R=INSTR(A$,X$)-1                                   :REM Root note = position of that char in A$. INSTR starts counting at 1, but we want 0, so subtract.
X$=GET$                                            :REM If the root note is natural, the next character will be the chord type. But...
IF X$="#"R=R+1:X$=GET$                             :REM If this char is # we need to increment the root, and get another char for chord type. 
C=INSTR(A$,X$)                                     :REM C encodes for chord type
T=(R+4-C MOD2)MOD12                                :REM even C means major third, odd C means minor third
F=(R+C DIV2)MOD12                                  :REM "Mm" gives C=14,15 meaning C DIV2=7 (perfect fifth.) C=13,16 give diminished and augmented: 6,8.
V=1                                                :REM V is the sound channel number ("voice")                             
PRINT"______"                                      :REM left side of keyboard for cosmetic reasons
FORN=0 TO 11                                       :REM at the start of each iteration initialise C to 1, to point to the 4 spaces/2 underscores in the string below for drawing white notes. 
  C=1-(N=4)*12                                     :REM if the note is E, add 12 so it points to the 6 underscores to draw the line between E and F. 
  B$=MID$(A$,N+1,1)                                :REM load B$ with the name of the current note.
  IF B$="#" C=7: B$=MID$(A$,N,1)+B$                :REM if the character encountered is a sharp, update C to point the characters for drawing a sharp. Find the previous character in A$ and join it to the beginning of B$ to complete the note name.
  PRINT MID$("    __---|________",C,6);            :REM print the key (6 characters.)
  IF(R-N)*(T-N)*(F-N)=0 PRINT B$;:SOUND V,-15,100+N*4,99:V=V+1  :REM if N is equal to R,T or F, print the note name beside the key, play the note and increment the channel number for the next note.  
  PRINT                                            :REM print a carriage return. It may be possible to golf this line out.
NEXT

应该如何从命令行使用程序?(我在Ubuntu机器上安装了BBC BASIC)
Mathieu Rodic

哇,我不知道Ubuntu上有BBC基本版。在我从中获得模拟器的网站上找不到我,并且我不使用Ubuntu。原始BBC基本版一次只能在一个内存中存储一​​个程序,因此您键入RUN。在使用仿真器的情况下,您必须启动仿真器环境,然后在其中运行。它具有一个文本编辑器,然后单击以运行,然后在程序终止时键入RUN再次运行该程序,或在环境中键入单个Basic命令。您可以使用我的模拟器生成命令行可执行文件,但前提是您必须购买完整版本。
级圣河

如果您想测试该程序,那么我能为您提供帮助的最佳方法是找到Windows计算机并下载我正在使用的确切版本。另外,如果您可以告诉我从何处获得Ubuntu版本,那么我可能会对此有所了解。
级圣河

BBC Basic也运行在Linux上,它们在其主页上提供了许多发行版,具体取决于主机OS。我只是没有设法使程序运行,既没有通过传递代码也没有将其粘贴到提示中……
Mathieu Rodic 2014年

我刚刚下载了Napoleon Brandy Basic,确实很难上手!您需要将代码另存为名为chords.nap的文本文件,然后在命令提示符下键入LOAD“ chords.nap”。它将行号添加到代码中(对原始BBC Basic更真实,将添加更多字符),然后键入RUN,程序在其中带有SOUND语句的行崩溃,并显示错误消息“不支持的Basic V功能找到了。” 如果您确实愿意,您实际上可以使用RT Russell的实现编写一个严肃的程序。但是有了Brandy basic,我什至都不会考虑。
级圣河

8

如您所知,我根本没有尝试过高尔夫球。我是一个音乐极客,我的宠儿是当人们用错误的谐音编写东西时(例如说C减小的和弦是CD#F#而不是C Eb Gb),所以我写了这个程序来获取谐音对。它通过将每个音符表示为F上方的完美五分之一数来实现。

值得一提的是,如果您想区分谐音,则可以在计算机程序中很好地将任何音程表示为许多完美的五分之一和多个八度。例如,增强的四分之一是6个完美的五分之一和-3个八度音阶,而减小的五分之一是-6个完美的五分之一和4个八度音阶。

Haskell,441个字符

import Data.List

notes = "FCGDAEB"

fromNum x = [notes !! (mod x 7)] ++ if x < 0 then replicate (-(div x 7)) 'b' else replicate (div x 7) '#'

toNum (x:xs) = y + 7 * if isPrefixOf "b" xs then -length xs else length xs
    where Just y = elemIndex x notes

chord xs = unwords . map (fromNum . \x -> toNum (init xs) + x) $ case last xs of 'A' -> [0,4,8]; 'M' -> [0,4,1]; 'm' -> [0,-3,1]; 'd' -> [0,-3,-6]

main = getLine >>= putStrLn . chord

一些示例调用:

jaspers:junk tswett$ ./chord
AM
A C# E
jaspers:junk tswett$ ./chord
C#m
C# E G#
jaspers:junk tswett$ ./chord
DbA
Db F A
jaspers:junk tswett$ ./chord
Cd
C Eb Gb
jaspers:junk tswett$ ./chord
A#M
A# C## E#
jaspers:junk tswett$ ./chord
Dbm
Db Fb Ab

5

Arduino的

输入/输出通过COM端口发送到Arduino或从Arduino接收。用户可以通过终端或Arduino IDE中的串行监视器与之交互。正如您可能从我选择的平台中猜到的那样,我正计划包括和弦的实际演奏(尽管我还没有完成)。

我已经成功解决了键盘红利问题,并且尝试解决了吉他问题,但收效有限。

和弦盒的大小为130字节,太长了,不值得。因此,我尝试了另一种方法,仅打印品号数字Tab样式。目前,这是81个字节,额外奖励为81-100 = -19。如果认为这种方法有效,那么我可以尝试对其进行改进。

所使用的和弦均为D型,其根在第二弦上,第五根在第三弦上,第三根在第一弦和第四弦上。第5和第6弦未使用,我在和弦框的右侧用X标记(左侧是更常用的,但可以找到右侧标记的示例。)

因为程序认为F是最低音符(为了与键盘兼容,同时避免这种和弦形状的过高音色),所以最高和弦是E(根音在第17个音色上)。请参见示例输出。

键盘在打高尔夫球方面更为成功。由于上述原因,它从FE而不是CB运行。当您可以清楚地看到黑色音符的轮廓以及白色音符之间的界限时,必须通过将屏幕逆时针旋转90%进行查看---。B和C之间的线可以扩展一些____,再增加一些字节。

接下来,我将尝试演奏音符。这将很有趣,因为尽管我相信Arduino Uno有3个内部计时器,但使用内置的tone命令一次只能演奏一个音符。有一个使用所有硬件计时器的外部库函数(它将使串行混乱,但是无论如何在那个阶段都不需要。)或者,我可能会尝试产生柔和的色调。

如果我能成功做到这一点,那我会打败它,但我认为它不会成为总冠军。

非高尔夫代码

String p="F#G#A#BC#D#E -Mm+",y,d[]=
{"    ","---|"},n="\n";

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(99999);
}

void loop(){
  char x[9]; int r,t,f,i,c=1;
  Serial.readBytesUntil(13,x,9);
  Serial.println(x);  
  r=p.indexOf(x[0]);
  if (x[1]==35|x[1]==98){c=2;r+=x[1]==35?1:-1;}
  f=p.indexOf(x[c])/2;
  t=4-p.indexOf(x[c])%2;

  //chord box
  y=n;for(i=24;i--;)y+=d[1]+(i%4?"":" \n");
  y[89]=y[107]='X'; y[t*4-10]=y[t*4+52]=y[f*4+14]=y[28]='O';
  Serial.print("\t "+String(r+6)+y);

  f+=r;t+=r;

  //tab style
  Serial.println(String(t+1)+n+String(r+6)+n
  +String(f-2)+n+String(t+3)+"\nX\nX\n");

  f%=12;t%=12;

  //piano
  for(i=0;i<12;i++){
    c=0;
    y=String(p[i]);
    if(y=="#") {c=1;y=p[i-1]+y;}      
    Serial.println(d[c]+"__"+((r-i&&t-i&&f-i)?"":y));
  }  
}

示例输出 文本行之间的间距越小,效果越好。因此,当我实际编辑帖子时,它看起来很棒,但是发布后在灰色框中令人恐惧。相反,我发布了Arduino串行监视器的屏幕截图,该屏幕截图具有中等的行距(因此显示质量也很高)。

在此处输入图片说明


等不及真正的声音了!
Mathieu Rodic'3

EM的注释是正确的(EG#B),但是在键盘上未正确对齐。看来您在正确的道路上!
卡梅隆·廷克

@CameronTinker请逆时针将屏幕倾斜90度,然后再次查看。请注意,由于我的帖子中所述的原因,键盘从F到E运行,而不是从C到B运行。选择F作为内部“零音”是吉他和键盘输出的折衷方案。左侧有3个黑色音符,右侧有2个黑色音符,并且输出音符正确对齐。扩大B和C之间的距离会更清楚,但会多花20个字节。粗略,但是我仍然认为我的键盘比Pandubear的键盘更具可读性。
级圣河

我不知道我怎么想念它!对于那个很抱歉。我是一名钢琴家,当我看到这是键盘看起来不太正确时,我的初衷是;)。
卡梅隆·廷克

@MathieuRodic我现在已经从Arduino发出声音了,但是它们是如此糟糕,我不确定我是否称它们为可识别的和弦。我将再尝试一次,但是Arduino发生了一些我不了解的事情。无论如何,我刚刚在BBC Basic中用键盘和声音发布了一个看起来更好的答案。因此,我稍后将更新此帖子
Level River St

4

Python3-315个字符

第一次进入代码高尔夫!现在仅支持小,大,减和增和弦。

z=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];y=[1,2,4,5,6]
def q(a):print(z[a%12])
a=input();k=(ord(a[0])+3)%7;j=k;m=4;s=0;f=7;
for i in y:
    if(k>=i):j+=1
if('#'in a):j+=1
if('b'in a):j-=1
if('m'in a or'0'in a):m=3
if('+'in a or"aug"in a):f=8
if('0'in a or"dim"in a):f=6;m=3
if('ma'in a):m=4
q(j);q(j+m);q(j+f);

2
使用'C C# D D# E F F# G G# A A# B'.split(' ')而不是文字数组来保存一些字节。
wchargin 2014年

2
if('#'in a):j+=1-> if'#'in a:j+=1=每个语句少2个字符。同样更改yrange()表达式也可以节省一些时间。欢迎!(并记住,换行符也很重要;))
gcq 2014年

2
@wch更多字节可以与被保存'C C# D D# E F F# G G# A A# B'.split());
undergroundmonorail

1
您如何计算分数?我认为您也必须将每行换成一个字符。顺便说一句,由于此答案仅在Python3中有效,因此我将编辑您的答案以明确说明这一点。另外,为什么不跳过y存储而不用存储,而是将第4行替换为?无论如何,欢迎来到Codegolf,希望您在这里玩得开心。[1,2,4,5,6]yfor i in[1,2,4,5,6]:
ace_HongKong独立2014年

1
您也可以通过仅缩进一个空格而不是第5行的四个空格来节省3个字符
。– ace_HongKongIndependence

4

Python 506(Unicode编码为1个字符)-150(声音)-150(键盘)= 206

为了播放声音,它使用pygame.midi。请注意,该pygame.midi.get_default_output_id()方法效果不佳。所以,你可以尝试转产o=Output(get_default_output_id())o=Output(1)o=Output(2)等。通常正确的值是0和5之间。

c=input()
s='C D EF G A B'.index(c[0])+{'#':1,'b':-1,'':0}[c[1:-1]]
m='0mM+'.index(c[-1])
t=s+3+m//2
R=[list(x)for x in['┌─'+'─┬─'*13+'─┐']+['│'+'  │'*14]*5+['└─'+'─┴─'*13+'─┘']]
i=3
for d in[3,6,3,3,6]*2:q=slice(i-1,i+2);R[0][q]='┬─┬';R[1][q]=R[2][q]=R[3][q]='│ │';R[4][q]='└┬┘';i+=d
X=[2]+[1,2,1,2,3,1,2,1,2,1,2,3]*2
from pygame.midi import*
init()
o=Output(get_default_output_id())
for s in[s,t,t+3+m%2]:R[[5,3][s%12 in[1,3,6,8,10]]][sum(X[:s+1])]='o';o.note_on(s+60,127,1)
for r in R:print(''.join(r))

结果

goooolf> python chords2.py
CM
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│ o│  │ o│  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Cm
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││o│ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│ o│  │  │  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Dm
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │ o│  │ o│  │ o│  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
D+
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │o││ ││o│ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │ o│  │  │  │  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
G+
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││o│ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │ o│  │ o│  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Am
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │  │ o│  │ o│  │ o│  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
C#0
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │o││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │ o│  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
EbM
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││o│ │ │ ││ ││o│ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

3

J-82个字符

自包含,从控制台输入中读取。如果需要stdin,请将最终名称更改13。声称没有奖金,仅涵盖三合会。

+/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1

而不是尖锐的注释,例如,C#您必须使用等效的平面名称Db。(对此进行更正会使代码膨胀很多。)四种类型的和弦0用于减小,m较小,M主要和+增强。

逻辑如下:我们使用最后一个字符向以0-3-6为基的偏移量添加偏移量,该偏移量选择了第三和第五种。同时,我们使用音符查找音阶中要从中拉出音符的位置。该;:两使得与索引成规模起步兼容,后来(受注&.)将会使拉把笔记放入空格分隔字符串。

用法示例:

   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
AM
A Ch E
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
Ab0
Ab B D
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
B+
B Eb G
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
Em
E G B

后缀“ h”是否遵循“音乐符号标准”之一?
Mathieu Rodic

@MathieuRodic我想这是一个灰色区域,所以我将它们全部撞到了公寓。功能不变。不知道为什么我没有这么早做。
algorithmhark

2

Javascript,224个字符

n=prompt();a="A0A#0B0C0C#0D0D#0E0F0F#0G0G#".split(0);x=1;r=a.indexOf(n[0]);n[1]=="#"&&(r++,x++);n[1]=="b"&&(r--,x++);s=r+4;l=r+7;(n[x]=="m"||n[x]==0)&&s++;s%=12;n[x]=="+"&&l++;n[x]==0&&l--;l%=12;alert(a[r]+" "+a[s]+" "+a[l])

这是我第一次打高尔夫。我认为它可以更短,但是我找不到要保存的字节。

支持主要的,m对于未成年人,0就迅速消失了,+对于增强,或37个字节dimaug


n[m]==0可以很简单!n[m]。在其他地方也一样。总共可以轻松切掉6个字符
Gaurang Tandon 2014年

@GaurangTandon由于n为字符串,n[m]==0将强制转换0"0",因此等于n[m]=="0""0" == 0是正确的,但是!"0"错误的。
小吃

我只是指出,因为输入时得到的输出相同AM。我也可能错了。
Gaurang Tandon 2014年

2

Python(143134个字符)

n,a='A A# B C C# D D# E F F# G G#'.split(),input();m,i=ord(a[-1])-42,n.index(a[:-1])
print(n[i],n[(i+4-m//2)%12],n[(i-4+(-m//2))%12]) 

我的第一个高尔夫挑战:),不知道是否可以减少更多字节。
这里使用的符号是* aug / + maj /,min /-dim
我应得的加分是因为代码中的常数为42:P


您可以像这样获得一些字节:n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Mathieu Rodic 2014年

1

Python 3:257-150 = 107

仅25个字符太长,无法击败J解决方案!那好吧。我认为这里有一些巧妙的想法。

I='AaBCcDdEFfGg'*2
Q='0123456789.,'*2
K="""-1#_2
-,#_0
-9#_.
____8
-6#_7
-4#_5
____3"""
r,*R,q=input()
r=I.find(r)+bool(R)
p=str.replace
for x in[0]+[8,4,7,3,6]['+Mm0'.find(q):][:2]:K=p(K,Q[x+r],I[x+r].upper())
for x in Q:K=p(K,x,' ')
print(p(K,' #','  '))

输入就像示例一样,尽管您必须使用完整的名称而不是平面名称。(例如,Gb必须为F#)

输出是钢琴的一个八度,从上方和左侧看,音符名称叠加在一起。应该只是想像力的一小部分。

$ echo C#m | python3 chords.py
-  _ 
-G#_ 
-  _ 
____ 
-  _E
-C#_ 
____ 

不错的工作!虽然,我在输出中看不到音符吗?对于CM,我们应该能够阅读C E G...
Mathieu Rodic 2014年

哦,我误解了我想的问题。让我们看看我是否可以在...中工作
Pandubear 2014年

固定!太长了……):
pandubear 2014年

您不能替换bool(R)R|0吗?
Mathieu Rodic'3

不,要点是R是一个列表,bool(R)如果为非空,则为1(true),如果为空,则为0(false)。该|运营商不与列表工作...
pandubear

1

Scala 537个字符-50

import java.util.Scanner
object C extends App{
val c=Map("M"->145,"m"->137,"+"->273,"0"->73,"7"->1169,"M7"->2193,"m7"->1161,"Mm7"->2185,"+7"->1297,"+M7"->2321,"07"->585,"7b5"->1097)
val n=List("A","A#","B","C","C#","D","D#","E","F","F#","G","G#")
val o=List("","Bb","Cb","B#","Db","","Eb","Fb","E#","Gb","","Ab")
val s=new Scanner(System.in).nextLine
val v=s indexWhere{c=>c!='#'&&c!='b'&&(c<'A'||c>'G')}
val (u,m)=s splitAt v
val x=n.indexOf(u)max o.indexOf(u)
val k=c(m)
for(i<-0 to 11)if((k&(1<<i))!=0)print(n((i+x)%12)+" ")
println}

0

Haskell,273个字符

n(s,a)="CCDDEFFGGAABB"!!(s+1-a):["b#"!!a|" b b  b b b "!!s/=' ']
t p=[(s,a)|s<-[11,10..0],a<-[0,1],n(s,a)==p]!!0
m(s,d)=n(mod s 12,d-3)
c q=[n(a,x),m(a+d,d),m(a+d+e,e)]where
 (a,x)=t$init q;f=lookup(last q).zip"0mM+";Just d=f[3,3,4,4];Just e=f[3,4,3,4]
main=print.c=<<getLine

结果

C0 ->["C","Eb","Gb"]   Cm ->["C","Eb","G"]    CM ->["C","E","G"]     C+ ->["C","E","G#"]    
C#0->["C#","F","G"]    C#m->["C#","F","G#"]   C#M->["C#","F","Ab"]   C#+->["C#","F","A"]    
D0 ->["D","F","Ab"]    Dm ->["D","F","A"]     DM ->["D","F#","A"]    D+ ->["D","F#","A#"]   
D#0->["D#","Gb","A"]   D#m->["D#","Gb","A#"]  D#M->["D#","G","Bb"]   D#+->["D#","G","B"]    
E0 ->["E","G","Bb"]    Em ->["E","G","B"]     EM ->["E","G#","B"]    E+ ->["E","G#","C"]    
F0 ->["F","Ab","B"]    Fm ->["F","Ab","C"]    FM ->["F","A","C"]     F+ ->["F","A","C#"]    
F#0->["F#","A","C"]    F#m->["F#","A","C#"]   F#M->["F#","A#","Db"]  F#+->["F#","A#","D"]   
G0 ->["G","Bb","Db"]   Gm ->["G","Bb","D"]    GM ->["G","B","D"]     G+ ->["G","B","D#"]    
G#0->["G#","B","D"]    G#m->["G#","B","D#"]   G#M->["G#","C","Eb"]   G#+->["G#","C","E"]    
A0 ->["A","C","Eb"]    Am ->["A","C","E"]     AM ->["A","C#","F"]    A+ ->["A","C#","F"]    
A#0->["A#","Db","F"]   A#m->["A#","Db","F"]   A#M->["A#","D","F"]    A#+->["A#","D","F#"]   
B0 ->["B","D","F"]     Bm ->["B","D","F#"]    BM ->["B","D#","Gb"]   B+ ->["B","D#","G"]    
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.