Ontem comprei uma gaita:
Figura 1: A gaita.
No entanto, meus sonhos de poder tocar gaita de blues com alma que move as pessoas e faz um homem adulto chorar foram rapidamente frustrados por dois problemas:
- A gaita só pode tocar certas notas;
- Eu sou deprimente ruim em tocar gaita.
Apesar da minha falta de habilidade na gaita, ainda existem algumas músicas que eu posso tocar nela. No entanto, não é imediatamente óbvio se eu sou capaz de tocar alguma música na gaita ou não. Dadas as notas de uma peça musical, escreva um programa para determinar se eu poderia tocar na minha gaita ou não.
Como mostra a figura acima, minha gaita tem dez buracos. Em cada buraco, eu posso expirar ou inspirar nele - o buraco que eu escolher, e se eu inspiro ou expiro nele, altera o tom do som resultante. Cada buraco tem um tom diferente ao expirar e inspirar, mas existem algumas combinações que resultam na mesma nota. No geral, minha gaita pode tocar 19 arremessos diferentes. Os arremessos são apresentados em notação científica musical - a letra representa a nota e o número representa em que oitava está.
Hole Breathing Note
1 Exhale C4
1 Inhale D4
2 Exhale E4
2 Inhale G4
3 Exhale G4
3 Inhale B4
4 Exhale C5
4 Inhale D5
5 Exhale E5
5 Inhale F5
6 Exhale G5
6 Inhale A5
7 Exhale C6
7 Inhale B5
8 Exhale E6
8 Inhale D6
9 Exhale G6
9 Inhale F6
10 Exhale C7
10 Inhale A6
Por exemplo, se eu expirasse no buraco 3, receberia uma G4
nota. Se eu inalasse no buraco 2, também receberia uma G4
nota. Se eu expirasse no buraco 7, receberia um C6
.
Quando respiro a gaita, além de exalar ou inalar, também posso escolher se devo respirar fina ou amplamente . Respirar levemente faz com que apenas um orifício soe, enquanto a respiração causa amplamente um orifício e os dois orifícios de ambos os lados do orifício. Eu não tenho as habilidades de embocadura para fazer dois furos - é um ou três.
Por exemplo, se eu exalasse levemente o orifício 4, apenas o orifício 4 soaria, então eu obteria um som C5. Se eu exalasse amplamente no orifício 4, os orifícios 3, 4 e 5 soariam e eu receberia um acorde G4, C5, E5. Se eu inalasse amplamente no orifício 4, os orifícios 3, 4 e 5 soariam, mas eles tocariam o tom da inspiração, resultando em um acorde B4, D5, F5. Observe que, para os orifícios de cada extremidade, se eu respirar fundo neles, soariam apenas dois orifícios (porque não há orifício 0 ou orifício 11).
No entanto, não consigo inspirar e expirar ao mesmo tempo. Por exemplo, eu poderia expirar nos orifícios 4, 5 e 6 para fazer com que as notas C5, E5 e G5 soassem ao mesmo tempo, formando um acorde. No entanto, não consigo inspirar e expirar ao mesmo tempo, por isso seria impossível tocar o acorde C5, F5, A5, pois teria que exalar de alguma forma no orifício 4 e inalar no orifício 5 e 6. Se ainda não está claro, esse tópico de comentários pode ser útil.
A entrada são as notas da música. As notas são anotadas da mesma maneira que estão acima na tabela e são separadas por vírgula. Notas envoltas em colchetes representam um acorde. Por exemplo:
C4,D4,G4,{D5,F5,A5},B5
Isso significa: "C4, então D4, depois G4, então D5, F5 e A5 ao mesmo tempo, depois B5". Seu programa pegará uma string nesse formato como entrada e saída, True
se for possível tocar música na minha gaita ou de False
outra forma. Para entradas e saídas de amostra, o exemplo acima deve ser exibido True
. A entrada, {C5,F5,A5}
por outro lado, será exibida False
.
Isso é código de golfe, portanto a entrada mais curta vence.
Aqui estão alguns casos de teste:
Entrada (escala principal CA):
C4,D4,E4,F4,G4,A4,B4,C5
Resultado:
False
(porque a gaita não pode tocar F4 ou A4)
Entrada (as 2 barras de abertura do Let It Go ):
E6,F6,A5,E6,F6,F6,E6,A5,F6,E6
Resultado:
True
Entrada:
{E6,G6,F6}
Resultado:
False
Entrada:
{G4,C5,E5},{F5,A5,B5}
Resultado:
True
Você pode supor que os acordes serão de ordem mais baixa para a mais alta.