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 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?[-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 est3/5
.-
représente fondamentalement la position des divisions, merci de m'expliquer!Réponses:
BBC Basic, 161 #
Le score exclut les commentaires. Pas encore joué au golf.
Production
Fonctionne correctement sur tous les cas de test sauf les deux longs. Car
Eb9
il semble qu'il manque un tiret dans le cas de test: il y en a 22-
et unX
, qui divise la chaîne en 24 morceaux égaux. Selon mes calculs manuels, c'est 9600Hz, ce qui est 37 cents au-dessus d'un D9. C'est exactement ce que mon programme produit. Si j'ajoute un autre tiret, j'obtiens Eb9 + 8 cents. Malheureusement, BBC Basic ne peut pas gérer les chaînes de plus de 255 caractères, donc leEb11
cas donne une erreur.la source
C, 179
Reçoit l'image ascii sur une ligne seule et la fréquence sur une ligne distincte.
Quelques caractères peuvent être supprimés en réduisant la précision des nombres magiques
17.3123
et57.376
.Sans le golf, le programme ressemble à ceci:
la source
scanf
chaîne de format génial . Je ne savais pas que tu pouvais faire ça. Je vérifierai le code de sortie plus tard (j'ai pensé à faire cela en C et bien que quelque chose de similaire me soit arrivé pour la sortie, je ne pouvais pas voir un moyen de faire le tout de manière compétitive.) Je suppose qued+9
c'est parce que vous êtes indexé sur note A donc vous devez ajuster le nombre d'octaves à l'index sur la note C: Je me demande s'il y a un moyen de contourner cela.JavaScript (199)
Appelez-le par exemple comme
t('[X-]',314.1592)
Fixé. (Puisque je vis en Europe, j'ai utilisé B au lieu de Bb et H au lieu de B =)
la source
t('[---X--]',11.7103)
(dernier exemple) donne-10
au lieu de-11
p="C0C#0D0D#0E0F0F#0G0G#0A0B0H".split(0)
vous permet d'économiser 2 caractères supplémentaires.round(x) = x+.5|0
qui n'est correcte que pour les nombres positifs, je corrigerai ça plus tard. @ipi merci!Python 3: 175
Non golfé:
la source