La trompette est un instrument d'aérophone à valve, généralement intégré B♭
. Le son est émis lorsque le joueur fait vibrer ses lèvres pour déplacer l'air à l'intérieur de l'instrument. Cette vibration s'acquiert en mettant sa bouche d'une manière spécifique, appelée l'embouchure. Différentes embouchures, avec des lèvres plus serrées ou plus lâches, produisent des hauteurs différentes.
De plus, chaque valve de la trompette change également la hauteur de l'instrument. Lorsqu'elle est enfoncée, une valve ferme un chemin à l'intérieur du tube de l'instrument, faisant circuler l'air sur un chemin plus long, abaissant ainsi la hauteur du son d'origine. Pour les besoins de ce défi, nous considérerons la B♭
trompette standard, dans laquelle la première valve abaisse le pitch d'un pas complet, la seconde abaisse le pitch d'un demi-pas et la troisième abaisse le pitch d'un et d'un Demi-pas.
Le défi
Votre défi est de créer un programme ou une fonction qui, compte tenu de deux entrées embouchure
et valves
, détermine la hauteur de la note jouée.
Aux fins de ce défi, les notes suivront la séquence:
B♭, B, C, C♯, D, E♭, E, F, F♯, G, G♯, A.
Règles
- Les E / S peuvent être prises / données par toute méthode raisonnable .
- Des échappatoires standard s'appliquent.
- Vous êtes autorisé à utiliser
b
et#
au lieu de♭
et♯
si vous le souhaitez. - L'entrée pour
valves
peut être considérée comme une liste de vannes enfoncées (1, 3
) ou une liste booléenne (1, 0, 1
). - C'est le code-golf , donc le code le plus court dans chaque langue l'emporte.
Cas de test:
Valves
dans ces cas de test est donné sous forme de liste booléenne, où 0 signifie enfoncé et 1 signifie enfoncé.
Embouchure: Valves: Output:
B♭ 0 0 0 B♭
B♭ 0 1 0 A
B♭ 1 0 1 F
C♯ 0 0 1 B♭
C♯ 1 1 1 G
E♭ 1 0 0 C♯
G 0 1 1 E♭
G♯ 1 0 0 F♯
G♯ 0 0 1 F
G 1 0 0 F
F♯ 1 0 0 E
D 1 0 1 A
A 1 1 1 E♭
E 1 1 0 C♯
E 0 0 1 C♯
Avertissement: je ne suis pas encore beaucoup un musicien, donc je m'excuse pour toute boucherie que j'ai pu faire sur les cas de test. Les corrections sont appréciées.
F# 100
être E pas F?C#
de la trompette sans appuyer sur aucune valve. Juste des notes spécifiques (B♭-F-B♭-D-F-A♭-B♭...
), la série harmonique deB♭
. Pourtant, même s'il ne reflète pas un véritable instrument, le défi est parfaitement bien défini.Réponses:
Python
32,12511981 octetsEssayez-le en ligne!
Beaucoup d'octets enregistrés grâce à Jonathan Allan.
Ma solution originale (en Python 3 ):
Essayez-le en ligne!
6 octets enregistrés grâce à @HyperNeutrino.
Explication
Tout d'abord, je crée un tableau de notes, mais de longueur double, je n'ai donc pas à me soucier de boucler de
Bb
àA
.Ensuite, je prends la saisie dans le format suivant (par exemple):
Je trouve ensuite l'index de la note de départ en utilisant
n.index(e,9)
(le9
est là pour m'assurer que je commence bien au milieu de la liste (doublée). Je calcule le décalage souhaité avec l'expression:Où
f
est la première soupape,s
est la deuxième soupape, ett
est la troisième.Enfin, il imprime simplement la note trouvée dans la liste en soustrayant le décalage de l'index de départ.
la source
"<some string>".split()
se divise par espace par défautstr
etint
moulages et permettant l' entrée évaluée) et inverser les notes et la compensation en avant ( en évitant le,9
dans leindex
. Appel Essayez - le en ligne!'Bb', 1, 1, 1
amener à indexer-6
ce qui seraitE
, comme requis) - c'est ce que TFeld a depuis fait .Wolfram Language (Mathematica) , 100 octets (et 134 pour une trompette qui fonctionne)
Essayez-le en ligne!
Assez simple.
Une meilleure sortie pour le coût de 34 octets.
la source
Gelée ,
3736 octetsUn lien dyadique acceptant les valves comme une liste de
1
s ou0
s comme une liste représentant[second, first, third]
à gauche et l'embouchure comme une liste de caractères à droite qui renvoie une liste de caractères.Essayez-le en ligne!
Comment?
la source
Rubis , 71 octets
Essayez-le en ligne!
70 caractères mais 80 octets
Essayez-le en ligne!
la source
Javascript 96 octets
Suivant l'idée de @vasilescur, voici l'implémentation dans js
la source
b
et je suis#
autorisé) mais vous devez utiliserb
et#
au lieu des appartements et des objets tranchants.Lot, 188 octets
Utilise
#
etb
: cela signifie queEb
etBb
sont des noms de variables légaux;#
est gérée en remplaçant la chaîne par+1
. Le résultat du remplacement de la chaîne est alors automatiquement évalué et les vannes sont ensuite prises en compte avant de rechercher le résultat dans une liste.la source
Stax , 32 octets
Exécutez-le et déboguez-le en ligne
Il prend un nom de note et une liste de valves enfoncées. Il crée un tableau de noms de notes, puis calcule l'intervalle total des valves et obtient la note à ce décalage dans le tableau.
Exécutez celui-ci
la source
Python 2 ,
8479 octetsEssayez-le en ligne!
la source
C (gcc) ,
92 8682 octetsEssayez-le en ligne!
Adapté de l'implémentation de @ Vazt .
la source
Perl6 / Rakudo 73 caractères
Techniquement, c'est 83 octets parce que j'ai mis les caractères Unicode dedans, mais les échanger contre des équivalents ASCII donnerait 73 octets.
Comme
{code block}
avec des paramètres comme$^a
celui-ci, c'est un lambda, avec une signature($a, $b, $c, $d)
.Appeler:
Moins golfé:
Ici, nous doublons une chaîne
'...' x 2
à l'aide de l'x
opérateur infixe, puis recherchons l'embouchure suivie de n notes à l'aide de l'opérateur smartmatch'...' ~~ /.../
- la charte regex sur\w\W?
laquelle est un mot char puis peut-être un non-mot char.Nous recherchons n instances de cette via
(\w\W?)**{$_}
, où nous avons déjà calculé n =$_
des paramètres$b
à$d
. Cela donne une correspondance de la note d'embouchure à la note résultante, dont nous voulons juste la dernière donc nous faisons correspondre cela avec une autre~~ /\w\W?$/
.Le calcul de
$_
first est nécessaire pour permettre$^b
la création implicite de paramètres sur le bloc.76 caractères
Une alternative utilisant un tableau plutôt que des correspondances de chaîne est 3 caractères supplémentaires:
La recherche de l'embouchure dans la liste est réalisée avec
@arr.first: $^a, :k
, qui renvoie l'index (clé) de l'élément trouvé avec:k
.Définir le tableau sur
$_
(en tant qu'objet) nous permet d'utiliser.first
et.[ ]
dessus sans dépenser trop de caractères.la source
C (gcc) , 155 octets
Essayez-le en ligne!
Une approche simple.
L'entrée de la vanne est 0,1.
L'entrée d'embouchure doit être en minuscules. Fait intéressant, TiO ne trouve pas
strcmpi()
sans inclurestring.h
, alors que mingw-gcc le permet avec l'-Wimplicit-function-declaration
avertissement standard .la source