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.
Respostas:
Python -
218209189 caracteresMínimo:
Para facilitar a leitura:
Dada uma sequência formatada como na descrição do problema,
t
retorneTrue
se a sequência for reproduzível na gaita descrita eFalse
se não for.Não há verificação da ordem das notas nos acordes. Salvo indicação em contrário, acredito que isso é suficiente, uma vez que não está na declaração do problema e passa todos os testes fornecidos em:
fonte
] if "".join(x) not
->]if"".join(x)not
Palavras-chave podem ser adjacentes a seqüências de caracteres, portanto,"and"
está correto.Javascript -
245243 caracteresMinificado:
E expandido:
A função
p
aceita uma string como entrada e retornaTrue
se a sequência de notas / acordes for reproduzível,False
caso contrário. Retorna resultados indefinidos se a entrada não for sintaticamente válida.Ele também assume com ousadia que as notas dos acordes são inseridas na ordem do furo ascendente (como no exemplo).
A contagem de caracteres pode ser reduzida em 14 se a função tiver permissão para retornar lógico
true
efalse
não seus equivalentes de cadeia.fonte
JavaScript (ES6), 230
Apenas uma versão reescrita da resposta da @ COTO:
Gostaria muito de receber dicas sobre isso ainda mais como eu estou começando a aprender ES6! :-)
fonte
Scala 178
Ungolfed:
Observe que a entrada malformada é mal tratada - qualquer string é aceita e muitas strings malformadas retornam true, por exemplo:
imprime verdadeiro.
fonte
Rebol - 188
Ungolfed:
Exemplo de uso (no console Rebol):
Enquanto esse código capta bobagens assim:
No entanto, permitirá coisas como esta através de:
Porque está analisando como "C4, D4".
Aqui está uma versão mais rigorosa do código:
Este golfe até 228 caracteres e agora retorna
false
...fonte
JavaScript ES6,
211209190 caracteresEu sei que isso pode ser jogado ainda mais. Vou tentar fazer isso em algumas horas;
Execute este código no Console da Web mais recente do Firefox, você receberá um método nomeado
C
que poderá chamar comoC("{G4,C5,E5},{F5,A5,B5}")
e ele retornaráTrue
ou deFalse
acordo.Estou assumindo uma entrada sintaticamente válida.
EDIT : Simplificado o regex e a verificação de comprimento.
fonte