音楽:この和音の名前は?


9

これは音楽の逆です:この和音には何がありますか?、指定された和音で音符を印刷します。今回の入力はコード内のノートのリストであり、あなたの仕事はそれがどのコードであるかを出力することです。

プログラムは、次の3和音をサポートする必要があります。例はルート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と同じであることに注意してください。どちらでも出力できますが、すべて出力するとおまけがあります。

ボーナスの7番目のコードは次の表のとおりです。

        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

ルール

  • 完全なプログラムまたは関数を記述できます。
  • 入力は、スペースまたは別の便利な文字で区切られたメモのリストです。文字列の配列(関数の引数から入力を取得する場合)またはそのような配列の文字列表現にすることもできます。
  • 入力は特定の順序である必要はありません。
  • 入力にノートが重複している可能性があります。それらは1つしかないのと同じように扱う必要があります。
  • 出力はコードの名前です。複数の名前を出力する場合、同じ入力規則が適用されます。
  • 入力がサポートされているコードでない場合は、ノートをそのまま印刷する必要があります。プログラムは、上記の表に記載されていない他のコードもサポートできます(有効ですが、ボーナスはありません)。
  • ウィキペディアの記事に記載されている他の表記法を使用できます。ただしC、Cメジャーを選択する場合は、どちらの場合も人間が読める接頭辞を追加して、単一の音符でコードを区別する必要があります。
  • このタスクに組み込み関数を使用することはできません(ある場合)。
  • これはコードゴルフです。バイト単位の最短コードが優先されます。

  • 入力: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

ボーナス

  • 解釈が複数ある場合にそれらをすべて出力する場合は-30(aug、sus4 / sus2およびdim7の場合)。
  • -70が7番目のコードもサポートする場合。
  • -200(MIDI入力を受け入れ、受け取った各コードを出力する場合)。ノートは同時に開始または終了する必要がないことに注意してください。中間状態で何が起こるかを決定します(クラッシュしないか、動作を停止しない限り)。パーカッションチャンネルにノートがない(または便利な場合はチャンネルが1つしかない)と考えるかもしれません。特にプラットフォームに依存する場合は、テスト用にテキスト(または配列)バージョンも提供することをお勧めします。

入力はフラットにすることができますか、それともシャープのみを使用していますか?B#などのメモを処理する必要がありますか?
feersum

@feersum(200ボーナスを要求しない限り)フラットを使用できます。いくつかの例を追加しました。あなたはハンドルに必要としないB#Cbなど
jimmy23013

あなたは言うCsus4 is the same as Gsus2。あなたはCsus2 is the same as Gsus4そう思いませんか?
Gareth

@Gareth ...はい。修繕。
jimmy23013

回答:


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 Compiler / Executor。デバッグモードを無効にし"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つの16進オフセットで表されます(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.