2つの音名が与えられたら、これら2つの音によって形成される音程が子音か不協音かを決定するプログラムを作成します。
前書き
西洋音楽では、12の「異なる」音しかありません。それらの名前は、最低から最高の順に並べられていますC, C#, D, D#, E, F, F#, G, G#, A, A#, B
。シーケンスは循環的です。つまり、のC
後B
に無限に続きます。
2つのトーン間の距離は、インターバルと呼ばれます。上記のシリーズ(C — C#
またはE — F
)で隣接する2つの音の間隔は、半音と呼ばれます。より遠くの音符の間隔は、最初から2番目の音まで(シーケンスをラップしている間)取得するのに必要な半音ステップの数として定義されます。いくつかの例:D to E
= 2半音、C to G
= 7半音、B to D#
= 4半音(これはシーケンスをラップします)。1
現在、これらの間隔は2つのカテゴリに分けられます。子音(一度に2つの音を弾くと心地よく鳴ります)と不協和音(それほどではありません)です。
子音の間隔を0、3、4、5、7、8、9半音に定義します。
残りは不協和音です。つまり、1、2、6、10、11半音です。
チャレンジ
次のことを行うために、「プログラム」(通常の広義の意味:関数は完全にOK)を作成します。
入力として2つの音名(上記のシーケンスの文字列)を使用します。好きなようにそれらを使用することができます(引数として、必要なもので区切られた引数として、自由に文字のリスト(例
["C","#"]
)としてそれらを使用することもできます。ただし、ノートに他の名前を割り当てることはできません(特に0から11までの番号を付けたり、番号を使用したりすることはできません)。あなたの音楽オタクのために、音符はオクターブなしで指定されます。この場合、ノートがどの順序で来て、どれがより低く、どれがより高いかは重要ではありません。最後に、上記のリストにない名前を処理する必要はありません。のような他の高調波
E#
、フラット、二重変更などはありません。2つの異なる値を選択します。プログラムは、入力内の2つの音符が形成する間隔が子音である場合は常に1つを出力し、そうでない場合はもう1つを出力する必要があります。(
True
andFalse
になる可能性がありますが、必要に応じてπとeでも可能です:))これはコードゴルフです。各言語のバイト単位の最短プログラムが優先されます。楽しむ!
例とテストケース
Note 1 Note 2 Output Interval [semitones]
C D Dissonant 2
A# A# Consonant 0
G D Consonant 7 (wraparound)
D# A Dissonant 6
F E Dissonant 11
A C Consonant 3
これには特に危険なケースがないため、これ以上追加しません。
これは私の最初の挑戦なので、建設的な批判は大歓迎です:—)。理論の説明がずさんな場合は、遠慮なく質問してください。最後に、これがthisまたはthisの duだとは言わないでください。そうでないことを確認しました。(後者は非常に似ていますが、より複雑です。少し簡単なチャレンジをすることで、人々が参加しやすくなると思いました。)
1:できる限りこの説明を簡略化しようとしました。間隔についてはさらに多くの理論があります。残しておかないでください。