Bei zwei gegebenen Notennamen müssen Sie ein Programm schreiben, das bestimmt, ob das von diesen beiden Noten gebildete Intervall konsonant oder dissonant ist.
Einführung
In der westlichen Musik gibt es nur 12 "verschiedene" Töne. Ihre Namen, sortiert vom niedrigsten zum höchsten, sind diese: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
. Die Abfolge ist zyklisch, dh sie setzt sich unendlich C
nach der anderen fort B
.
Der Abstand zwischen zwei Tönen wird als Intervall bezeichnet . Das Intervall zwischen zwei Noten, die in der obigen Reihe benachbart sind (z. B. C — C#
oder E — F
), wird als Halbton bezeichnet . Das Intervall zwischen weiter entfernten Noten ist als die Anzahl der Halbtonschritte definiert, die erforderlich sind, um von der ersten zur zweiten zu gelangen (wobei möglicherweise die Sequenz umbrochen wird). Einige Beispiele: D to E
= 2 Halbtöne, C to G
= 7 Halbtöne, B to D#
= 4 Halbtöne (dies umgibt die Sequenz). 1
Nun werden diese Intervalle in zwei Kategorien unterteilt: Konsonant (angenehm klingend, wenn Sie die beiden Noten gleichzeitig spielen) und Dissonant (nicht so sehr).
Definieren wir die Konsonantenintervalle als: 0, 3, 4, 5, 7, 8 und 9 Halbtöne.
Der Rest ist dissonant, nämlich: 1, 2, 6, 10 und 11 Halbtöne.
Die Herausforderung
Schreiben Sie ein "Programm" (im weitesten Sinne des Wortes: eine Funktion ist vollkommen in Ordnung), um Folgendes zu tun:
Nehmen Sie zwei Notennamen (Zeichenfolgen aus der obigen Sequenz) als Eingabe. Sie können sie verwenden, wie Sie möchten (von stdin als Argumente, getrennt durch beliebige Zeichen
["C","#"]
). Sie können sie auch als Liste von Zeichen verwenden (z . B. ). Sie dürfen den Noten jedoch keine anderen Namen zuweisen (insbesondere Sie nicht) darf sie nicht von 0 bis 11 nummerieren und die Zahlen verwenden).Für Sie Musikfreaks werden die Noten ohne Oktave angegeben. In diesem Fall spielt es auch keine Rolle, in welcher Reihenfolge die Noten kommen und welche niedriger und welche höher sind. Schließlich müssen Sie keine Namen behandeln, die nicht in der obigen Liste aufgeführt sind. Keine anderen Enharmonika wie
E#
, keine Wohnungen, Doppelveränderungen und so weiter.Wählen Sie zwei verschiedene Werte. Ihr Programm muss immer dann einen davon ausgeben, wenn das Intervall, das durch die beiden Noten in der Eingabe gebildet wird, konsonant ist, und den anderen, wenn dies nicht der Fall ist. (Könnte sein
True
undFalse
, aber auch π und e wenn du willst :))Dies ist ein Code-Golf. Das kürzeste Programm in Bytes in jeder Sprache gewinnt. Habe Spaß!
Beispiele und Testfälle
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
Ich füge keine weiteren hinzu, da diesbezüglich keine besonders tückischen Fälle vorliegen.
Dies ist meine erste Herausforderung, daher ist jede konstruktive Kritik herzlich willkommen: -). Wenn Sie die Erklärung der Theorie schlampig finden, können Sie gerne Fragen stellen. Zum Schluss sagen Sie mir bitte nicht, dass dies ein Betrug von diesem oder jenem ist . Ich habe dafür gesorgt, dass es nicht so ist. (Letzteres ist ziemlich ähnlich, aber komplexer. Ich dachte, dass das Aufstellen einer etwas einfacheren Herausforderung es den Leuten leichter macht, beizutreten.)
1 : Ich habe versucht, diese Erklärung so weit wie möglich zu vereinfachen. Es gibt viel mehr Theorie über Intervalle. Bitte verprügel mich nicht, weil ich es ausgelassen habe.