Dados dois nomes de notas, você deve escrever um programa que determine se o intervalo formado por essas duas notas é consoante ou dissonante.
Introdução
Na música ocidental, existem apenas 12 tons "diferentes". Seus nomes, ordenados menor para o maior, são estas: C, C#, D, D#, E, F, F#, G, G#, A, A#, B
. A sequência é cíclica, ou seja, continua com outra C
após o B
infinitamente.
A distância entre dois tons é chamada de intervalo . O intervalo entre duas notas adjacentes na série acima (por exemplo, C — C#
ou E — F
) é chamado de semitom . O intervalo entre as notas mais distantes é definido como o número de etapas de semitons necessárias para ir do primeiro ao segundo (enquanto possivelmente envolve a sequência). Alguns exemplos: D to E
= 2 semitons, C to G
= 7 semitons, B to D#
= 4 semitons (isso envolve a sequência). 1 1
Agora, esses intervalos são divididos em duas categorias: consoante (soando agradavelmente se você tocar as duas notas ao mesmo tempo) e dissonante (nem tanto).
Vamos definir os intervalos consoantes como: 0, 3, 4, 5, 7, 8 e 9 semitons.
O restante deles é dissonante, a saber: 1, 2, 6, 10 e 11 semitons.
O desafio
Escreva um "programa" (no sentido amplo da palavra: uma função está perfeitamente bem) para fazer o seguinte:
Pegue dois nomes de notas (sequências da sequência acima) como entrada. Você pode tomá-los como quiser (do stdin, como argumentos, separados pelo que você quiser, até sinta-se à vontade para tomá-los como uma lista de caracteres (por exemplo
["C","#"]
).) No entanto, você não pode atribuir nenhum outro nome às notas (especialmente você não pode numerá-los de 0 a 11 e usar os números).Para os fãs de música por aí, as notas serão especificadas sem a oitava. Nesse caso, também não importa em qual ordem as notas vêm e qual é mais baixa e qual é mais alta. Por fim, você não precisa manipular nenhum nome que não esteja na lista acima. Nenhuma outra enarmônica como
E#
, sem apartamentos, alterações duplas e assim por diante.Escolha dois valores diferentes. Seu programa deve produzir um deles sempre que o intervalo formado pelas duas notas na entrada for consoante e o outro, se não for. (Pode ser
True
eFalse
, mas até π e e se você quiser :))Este é um código de golfe. O programa mais curto em bytes em cada idioma vence. Diverta-se!
Exemplos e casos de teste
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
Não adiciono mais, pois não há casos particularmente traiçoeiros nisso.
Este é o meu primeiro desafio, portanto qualquer crítica construtiva é muito bem-vinda: --). Se você achar a explicação da teoria superficial, sinta-se à vontade para fazer perguntas. Finalmente, por favor, não me diga que este é um joguete de este ou este . Eu tive certeza de que não é. (O último é bem parecido, mas mais complexo. Pensei que colocar um desafio um pouco mais simples tornaria mais fácil a participação de pessoas.)
1 : Tentei simplificar essa explicação o máximo que pude. Há muito mais teoria sobre os intervalos. Por favor, não me bata por deixá-lo de fora.