Tâche
Écrivez un programme pour déterminer la note émise, ainsi que le nombre de cents désaccordés, d'une corde accordée à une fréquence donnée et enfoncée à un moment donné.
Par souci de simplicité, supposons que la fréquence du son produit et la longueur de la corde à droite de l'endroit où elle est pressée sont inversement proportionnelles.
Remarque: cette tâche concerne uniquement le ton fondamental, et non les harmoniques / autres harmoniques.
Contribution
Votre programme reçoit deux données:
Une chaîne de longueur arbitraire, représentant la chaîne en question. Cette chaîne sera marquée d'un X où la chaîne doit être maintenue enfoncée.
[-----] 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)
Supposons que la note soit jouée en utilisant la partie de la corde à droite de la
X
.- Un nombre (pas nécessairement un entier), indiquant la fréquence à laquelle la chaîne est accordée. La précision de ce nombre sera au plus de quatre chiffres après la décimale.
On peut supposer que les fréquences passées se situeront entre 10 Hz
et 40000 Hz
.
La saisie peut être transmise dans le format de votre choix. Veuillez spécifier comment la contribution est acceptée dans votre programme dans votre réponse.
Production
Votre programme doit produire à la fois la note la plus proche * dans le système d'accord de tempérament égal à douze tons et le nombre de centièmes de la note la plus proche que le son dénoté par la chaîne serait (arrondi au cent le plus proche).
+n
les cents doivent être utilisés pour désigner les n
cents nets / au-dessus de la note, et les -n
cents pour plat / en dessous de la note.
La note doit être émise en notation de hauteur scientifique. Supposons que A4 est réglé 440Hz
. Utilisez b et # pour des notes plates / nettes. Remarque: vous pouvez utiliser soit tranchant soit plat. Pour la note à 466.16Hz
, soit A#
ou Bb
peut être émis pour la note.
Le format de la sortie dépend de vous, tant que la sortie ne contient que les deux informations précédemment spécifiées (c'est-à-dire que l'impression de chaque sortie possible n'est pas autorisée).
* la note la plus proche fait référence à la note la plus proche du son dénoté par l'entrée, mesurée en nombre de cents (donc la note qui se trouve à l'intérieur 50 cents
du son). Si le son est 50 cents
éloigné de deux notes différentes (après l'arrondi), alors l'une ou l'autre des deux notes peut être émise.
Exemples
Votre programme devrait fonctionner pour tous les cas, pas seulement les exemples suivants.
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--]
* Des images nettes ou plates auraient pu être émises.
Liens potentiellement utiles
C'est le code-golf, donc la réponse la plus courte l'emporte.
[-X--]
, la chaîne est divisée à 4 endroits (et donc en 5 parties), et pressée à la seconde de ces divisions. Ainsi, il est pressé 2/5
et la longueur utilisée est 3/5
.
-
représente fondamentalement la position des divisions, merci de m'expliquer!
[--X--]
la chaîne est pressée au milieu de la division où lex
est placé, tandis que le dernier[-X--]
serait à 3/8 (pas 2/5) en suivant cette logique. Ou est-ce que je comprends quelque chose de mal?