Tarea
Escriba un programa para determinar la nota que suena, junto con cuántos centavos fuera de tono, de una cuerda sintonizada a una frecuencia dada y presionada hacia abajo en un punto dado.
En aras de la simplicidad, suponga que la frecuencia del sonido producido y la longitud de la cuerda a la derecha de donde se presiona son inversamente proporcionales.
Nota: esta tarea se ocupa únicamente del tono fundamental, y no con armónicos u otros armónicos.
Entrada
Su programa recibe dos datos:
Una cadena de longitud arbitraria, que representa la cadena en cuestión. Esta cadena se marcará con una X donde la cadena se mantendrá presionada.
[-----] 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)
Suponga que la nota suena usando la parte de la cadena a la derecha de
X
.- Un número (no necesariamente un número entero), que significa la frecuencia con la que se afina la cadena. La precisión de este número será como máximo cuatro dígitos más allá del decimal.
Se puede suponer que las frecuencias pasadas se ubicarán entre 10 Hz
y 40000 Hz
.
La entrada se puede pasar en un formato de su elección. Especifique cómo se acepta la entrada en su programa en su respuesta.
Salida
Su programa debe emitir tanto la nota más cercana * en el sistema de afinación de temperamento igual de doce tonos como el número de centavos de distancia de la nota más cercana que el sonido denotado por la cuerda sería (redondeado al centavo más cercano).
+n
los centavos se deben usar para denotar n
centavos agudos / por encima de la nota, y -n
centavos para los planos / debajo de la nota.
La nota debe salir en notación científica de tono. Suponga que A4 está sintonizado 440Hz
. Use by # para notas planas / agudas. Nota: Se puede usar bien filoso o plano. Para la nota al 466.16Hz
, ya sea A#
o Bb
puede ser emitida por la nota.
El formato de salida depende de usted, siempre que la salida contenga solo las dos piezas de información previamente especificadas (es decir, no se permite imprimir todas las salidas posibles).
* la nota más cercana se refiere a la nota más cercana al sonido denotado por la entrada, medida en el número de centavos (por lo tanto, la nota que está dentro 50 cents
del sonido). Si el sonido está 50 cents
alejado de dos notas diferentes (después del redondeo), se puede emitir cualquiera de las dos notas.
Ejemplos
Su programa debería funcionar para todos los casos, no solo para los siguientes ejemplos.
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--]
* Ya sea afilado o plano podría haber salido.
Enlaces potencialmente útiles
- Notas y frecuencias
- Página de Wikipedia sobre notación de tono científico
- Página de Wikipedia sobre centavos
Este es el código de golf, por lo que gana la respuesta más corta.
[--X--]
la cadena se presiona en el medio de la división dondex
se coloca, mientras que el último[-X--]
estaría en 3/8 (no 2/5) cuando se sigue esta lógica. ¿O entiendo algo mal?[-X--]
, la cadena se divide en 4 lugares (y, por lo tanto, en 5 partes), y se presiona en la segunda de estas divisiones. Por lo tanto, se presiona en2/5
, y la longitud utilizada es3/5
.-
básicamente representa la posición de las divisiones, ¡gracias por explicarlo!Respuestas:
BBC Basic, 161 #
La puntuación excluye los comentarios. No golf todavía.
Salida
Funciona correctamente en todos los casos de prueba, excepto los dos largos. Por
Eb9
lo que parece hay un guión que falta en el caso de prueba: Hay 22-
y unoX
, que divide la cadena en 24 partes iguales. Según mis cálculos manuales, esto es 9600Hz, que es 37 centavos por encima de un D9. Esto es exactamente lo que produce mi programa. Si agrego otro guión obtengo Eb9 + 8 centavos. Desafortunadamente, BBC Basic no puede manejar cadenas de más de 255 caracteres, por lo que elEb11
caso da un error.fuente
C, 179
Recibe la imagen ascii en una línea por sí misma y la frecuencia en una línea separada.
Se pueden soltar algunos caracteres reduciendo la precisión de los números mágicos
17.3123
y57.376
.Sin el golf, el programa se ve así:
fuente
scanf
cadena de formato impresionante . No tenía idea de que pudieras hacer eso. Veré su código de salida más tarde (pensé en hacer esto en C y aunque se me ocurrió algo similar para la salida, no pude ver una manera de hacer todo de manera competitiva). Supongo qued+9
es porque está indexado en nota A, por lo que debe ajustar el número de octava al índice en la nota C: Me pregunto si hay alguna forma de evitarlo.JavaScript (199)
Llámalo, por ejemplo, como
t('[X-]',314.1592)
Fijo. (Como vivo en Europa, usé B en lugar de Bb y H en lugar de B =)
fuente
t('[---X--]',11.7103)
(último ejemplo) da en-10
lugar de-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
ahorra 2 caracteres adicionales.round(x) = x+.5|0
cual solo es correcta para números positivos, lo arreglaré más tarde. @ipi gracias!Pitón 3: 175
Sin golf:
fuente