Con dos nombres de nota, debe escribir un programa que determine si el intervalo formado por estas dos notas es consonante o disonante.
Introducción
En la música occidental, solo hay 12 tonos "diferentes". Sus nombres, ordenados de menor a mayor, son los siguientes: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
. La secuencia es cíclica, es decir, continúa con otra C
después de la B
, infinitamente.
La distancia entre dos tonos se llama intervalo . El intervalo entre dos notas que son adyacentes en la serie anterior (por ejemplo, C — C#
o E — F
) se llama semitono . El intervalo entre notas más distantes se define como la cantidad de pasos de semitonos necesarios para pasar de la primera a la segunda (mientras se ajusta la secuencia). Algunos ejemplos: D to E
= 2 semitonos, C to G
= 7 semitonos, B to D#
= 4 semitonos (esto envuelve la secuencia). 1
Ahora, estos intervalos se dividen en dos categorías: consonantes (que suena agradablemente si toca las dos notas a la vez) y disonante (no tanto).
Definamos los intervalos de consonantes como: 0, 3, 4, 5, 7, 8 y 9 semitonos.
El resto de ellos es disonante, a saber: 1, 2, 6, 10 y 11 semitonos.
El reto
Escriba un "programa" (en el sentido amplio habitual de la palabra: una función está perfectamente bien) para hacer lo siguiente:
Tome dos nombres de notas (cadenas de la secuencia anterior) como entrada. Puede tomarlos como quiera (desde stdin, como argumentos, separados por lo que quiera, incluso puede tomarlos como una lista de caracteres (por ejemplo
["C","#"]
). Sin embargo, no puede asignar ningún otro nombre a las notas (especialmente usted no puede numerarlos del 0 al 11 y usar los números).Para los fanáticos de la música, las notas se especificarán sin la octava. En este caso, tampoco importa en qué orden vienen las notas y cuál es más bajo y cuál es más alto. Finalmente, no necesita manejar ningún nombre que no esté en la lista anterior. No hay otras enarmónicas como
E#
, sin pisos, dobles alteraciones, etc.Elija dos valores diferentes. Su programa debe generar uno de ellos siempre que el intervalo formado por las dos notas en la entrada sea consonante, y el otro si no lo son. (Podría ser
True
yFalse
, pero incluso π y e si quieres :))Este es un código de golf. El programa más corto en bytes en cada idioma gana. ¡Que te diviertas!
Ejemplos y casos de prueba
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
No agrego más de ellos ya que no hay casos particularmente traicioneros en esto.
Este es un primer desafío mío, por lo que cualquier crítica constructiva es calurosamente bienvenida :—). Si encuentra la explicación de la teoría descuidada, no dude en hacer preguntas. Finalmente, por favor no me digas que esto es un engaño de esto o esto . Me aseguré de que no sea así. (Esto último es bastante similar pero más complejo. Pensé que presentar un desafío un poco más simple facilitaría la participación de las personas).
1 : Traté de simplificar esta explicación lo más que pude. Hay mucha más teoría sobre los intervalos. Por favor, no me critiques por dejarlo fuera.