Tarefa
Escreva um programa para determinar a nota tocada, além de quantos centavos desafinados, de uma corda afinada para uma determinada frequência e pressionada em um determinado ponto.
Por uma questão de simplicidade, suponha que a frequência do som produzido e o comprimento da corda à direita de onde ele é pressionado sejam inversamente proporcionais.
Nota: esta tarefa lida apenas com o tom fundamental, e não com sobretons / outros harmônicos.
Entrada
Seu programa recebe dois dados:
Uma sequência de comprimento arbitrário, representando a sequência em questão. Essa sequência será marcada com um X onde a sequência deve ser mantida pressionada.
[-----] is a string divided in six sections (five divisions). [--X--] is a string pressed at the exact center of the string. [X----] is a string pressed at 1/6 the length of the string. (Length used is 5/6) [-X--] is a string pressed at 2/5 of the length of the string. (Length used is 3/5)
Suponha que a nota seja tocada usando a parte da corda à direita da
X
.- Um número (não necessariamente um número inteiro), significando a frequência na qual a sequência é sintonizada. A precisão desse número terá no máximo quatro dígitos após o decimal.
Pode-se supor que as frequências passadas estarão entre 10 Hz
e 40000 Hz
.
A entrada pode ser transmitida no formato de sua escolha. Especifique como a entrada é aceita em seu programa em sua resposta.
Resultado
Seu programa deve emitir a nota mais próxima * no sistema de ajuste de temperamento com doze tons e o número de centavos da nota mais próxima que o som indicado pela corda seria (arredondado para o centavo mais próximo).
+n
centavos devem ser usados para indicar n
centavos afiados / acima da nota e -n
centavos para flat / abaixo da nota.
A nota deve ser impressa em notação científica. Suponha que A4 esteja sintonizado 440Hz
. Use be # para obter notas agudas / nítidas. Nota: Pode ser afiada ou plana. Para a nota em 466.16Hz
, uma A#
ou Bb
pode ser emitida para a nota.
O formato da saída depende de você, desde que a saída contenha apenas as duas informações especificadas anteriormente (por exemplo, imprimir todas as saídas possíveis não é permitido).
* nota mais próxima refere-se à nota mais próxima do som indicado pela entrada, medido no número de centavos (portanto, a nota que está dentro 50 cents
do som). Se o som estiver 50 cents
longe de duas notas diferentes (após o arredondamento), qualquer uma das duas notas poderá ser emitida.
Exemplos
Seu programa deve funcionar para todos os casos, não apenas para os seguintes exemplos.
Output Input Frequency Input String
A4, +0 cents 220 [-----X-----]
A5, +0 cents 220 [--------X--]
D5, -2 cents 440 [--X--------]
B4, -49 cents 440 [X----------]
A#4, +19 cents* 314.1592 [X-]
Eb9, +8 cents* 400 [-----------------------X]
Eb11,+8 cents* 100 [--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------X]
D#1, +49 cents* 10 [--X]
A0, -11 cents 11.7103 [---X--]
* Afiado ou achatado, poderia ter sido produzido.
Links potencialmente úteis
- Notas e frequências
- Página da Wikipedia na Notação científica de afinação
- Página da Wikipedia em centavos
Este é o código-golfe, por isso a resposta mais curta vence.
[--X--]
a corda é pressionada no meio da divisão em que o localx
é colocado, enquanto a última[-X--]
seria em 3/8 (não em 2/5) ao seguir essa lógica. Ou entendo algo errado?[-X--]
, a sequência é dividida em 4 lugares (e, portanto, em 5 partes) e pressionada na segunda dessas divisões. Assim, é pressionado em2/5
e o comprimento usado é3/5
.-
representa basicamente a posição das divisões, obrigado por explicar!Respostas:
BBC Basic, 161 #
A pontuação exclui comentários. Ainda não jogou golfe.
Resultado
Executa corretamente em todos os casos de teste, exceto os dois longos. Para
Eb9
parece que há um traço ausente do caso de teste: Existem 22-
e umX
, que divide a string em 24 partes iguais. De acordo com meus cálculos manuais, isso é 9600Hz, que é 37 centavos acima de um D9. É exatamente isso que meu programa gera. Se eu adicionar outro traço, recebo Eb9 + 8 centavos. Infelizmente, o BBC Basic não pode manipular cadeias com mais de 255 caracteres; portanto, oEb11
caso apresenta um erro.fonte
C, 179
Recebe a imagem ascii em uma linha por si só, e a frequência em uma linha separada.
Alguns caracteres podem ser eliminados, reduzindo a precisão dos números mágicos
17.3123
e57.376
.Sem o golfe, o programa fica assim:
fonte
scanf
sequência de formato impressionante . Eu não tinha ideia de que você poderia fazer isso. Verificarei o código de saída mais tarde (pensei em fazer isso em C e, embora algo semelhante tenha me ocorrido para a saída, não consegui encontrar uma maneira de fazer tudo de forma competitiva.) Presumo qued+9
seja porque você está indexado em note A, então você precisa ajustar o número da oitava no índice da nota C: Gostaria de saber se existe uma maneira de contornar isso.JavaScript (199)
Chame, por exemplo, como
t('[X-]',314.1592)
Fixo. (Como moro na Europa, usei B em vez de Bb e H em vez de B =)
fonte
t('[---X--]',11.7103)
(último exemplo) dá-10
ao invés de-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
economiza 2 caracteres adicionais.round(x) = x+.5|0
qual só é correto para números positivos, eu vou corrigir isso mais tarde. @ipi thanks!Python 3: 175
Ungolfed:
fonte