Des lignes directrices
Tâche
Étant donné deux notes, entrées sous forme de chaînes ou de listes / tableaux, calculez le nombre de demi-tons qui les séparent (y compris les notes elles-mêmes), en sortie sous forme de nombre.
Explication d'un demi-ton:
Un demi-ton est une étape vers le haut ou vers le bas du clavier. Un exemple est C à C #. Comme vous pouvez le voir ci-dessous, la note C est sur une note blanche et C # est la note noire juste au-dessus. Les demi-tons sont les sauts d'une note noire à la prochaine note blanche, vers le haut ou vers le bas, à l'exception de:
- B à C
- C à B
- E à F
- F à E
Exemples
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
Règles
- La plus grande distance entre deux notes est de 13 demi-tons.
- La deuxième note entrée sera toujours au-dessus de la première note entrée.
- Vous pouvez prendre l'entrée sous forme de chaîne ou de tableau / liste. Si vous le prenez comme une chaîne, les notes seront séparées par des virgules (par exemple
String -> 'A, F'
,Array -> ['A', 'F']
). - Vous pouvez supposer que vous recevrez toujours deux notes valides.
- Les objets tranchants seront désignés par
#
et les appartements seront désignés parb
- Votre code doit prendre en charge les équivalents enharmoniques (par exemple, il doit prendre en charge F # et Gb)
- Votre code n'a pas besoin de prendre en charge les notes nommées avec, mais peut être nommé sans tranchant ou plat (c'est-à-dire que vous n'avez pas besoin de prendre en charge E # ou Cb). Des points bonus si votre code le prend en charge.
- Votre code n'a pas besoin de prendre en charge les doubles objets tranchants ou doubles.
- Vous pouvez supposer que si vous obtenez les deux les mêmes notes ou la même hauteur (par exemple 'Gb, Gb' ou 'A #, Bb'), la seconde ne sera pas exactement une octave au-dessus de la première.
- C'est le golf de code donc la réponse avec le moins d'octets gagne.
G -> G#
car ils sont tous les deux inclus.Cb
ouE#
? Qu'en est-il des doubles objets tranchants / plats?(X, Y]
si C à C # est 1 demi-ton et C à C est 12 demi-tons.Réponses:
Python 2 , 66 octets
Essayez-le en ligne!
Python 2 , 68 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 78 octets
1 octet enregistré grâce à @Neil
Prend les notes dans la syntaxe de curry
(a)(b)
.Cas de test
Afficher l'extrait de code
Fonction de hachage
Le but de la fonction de hachage est de convertir une note en un pointeur dans une table de recherche contenant les décalages en demi-tons (C = 0, C # = 1, ..., B = 11), stockés en hexadécimal.
Nous avons d' abord ajout d' un « 3 » à la note et analyser la chaîne résultant en base-36, conduisant à un nombre entier N . Parce que «#» est un caractère non valide, il est simplement ignoré, ainsi que tout caractère qui le suit.
Ensuite, nous calculons:
Voici un résumé des résultats.
À propos des appartements et des objets tranchants
Vous trouverez ci-dessous la preuve que cette fonction de hachage garantit qu'une note suivie d'un «#» donne le même résultat que la note suivante suivie d'un «b» . Dans ce paragraphe, nous utilisons le préfixe @ pour les quantités en base 36.
Par exemple, Db sera converti en @ db3 et C # sera converti en @c (voir le paragraphe précédent). Nous voulons prouver que:
Ou dans le cas général, avec Y = X + 1 :
@ b3 est 399 en décimal. Donc:
1296 est congru à 1 modulo 37 , donc cela peut être simplifié comme:
Un cas particulier est la transition de G # à Ab , car nous nous attendons à ce que l' Hb soit conforme aux formules ci-dessus. Cependant, celui-ci fonctionne également parce que:
la source
Perl,
3932 octetsComprend
+1
pourp
Donnez les notes de début et de fin sur deux lignes sur STDIN
Juste le code:
la source
Japt , 27 octets
Testez-le en ligne! Prend l'entrée comme un tableau de deux chaînes.
Fonctionne également pour toute quantité d'objets tranchants ou plats sur n'importe quelle note de base!
Explication
la source
Perl 5 +
-p
, 66 octetsEssayez-le en ligne!
Prend des valeurs séparées par des virgules. Fonctionne également pour Cb, B #, E #, Fb et multiple # / b.
Explication:
Explication pour eval:
la source
Rubis , 56 octets
Essayez-le en ligne!
Les lettres sont analysées en fonction de leur temps de code ASCII
5/3
comme suit (cela donne le nombre requis de demi-tons plus un décalage de 108)Le dernier caractère (
#
,b
ou la lettre à nouveau) est analysé comme son code ASCII divisé par 32 comme suitCeci est soustrait du code lettre.
Ensuite, le résultat final est renvoyé comme
13-(difference in semitones)%12
la source
Stax ,
2524 octetsExécutez-le et déboguez-le en ligne
La représentation ascii correspondante du même programme est la suivante.
En effet, il calcule l'index du clavier de chaque note à l'aide d'une formule, puis calcule l'intervalle résultant.
2 - code / 32
oùcode
est le code ascii du dernier caractère.la source
["F#","B"]
devrait être 6.Lot,
136135 octetsExplication: Les substitutions du
c
sous - programme sont remplacées#
dans le nom de la note par+1
etb
par-1
. Comme cela est insensible à la casse,Bb
devient-1-1
. Les variables pourC
...A
(également insensibles à la casse) sont donc choisies pour être le nombre approprié de demi-tonsB=-1
. La chaîne résultante est ensuite évaluée, et l'astuce @ xnor de soustraire le résultat de la valeur donne l'effet souhaité de soustraire les valeurs de note les unes des autres. Edit: Enfin, j'utilise l'astuce de @ Arnauld pour soustraire le modulo de 13 pour obtenir la réponse souhaitée, en économisant 1 octet.la source
Python 3 , 95 octets
Essayez-le en ligne!
-14 octets grâce à user71546
la source
ord(q[0])-65
remplacement"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
remplacement1+((g(b)-g(a))%12or 12)
Gelée , 28 octets
Un lien monadique acceptant une liste de deux listes de caractères et renvoyant un entier.
Essayez-le en ligne! ou voir tous les cas possibles .
Comment?
Effectue une arithmétique bizarre sur les ordinaux des caractères d'entrée pour mapper les notes sur les nombres entiers de zéro à douze, puis effectue une décompression de base en tant que proxy pour modulo par douze où zéro est ensuite remplacé par 12 puis en ajoute un.
Également à 28 octets ...
Un port (pas si direct) de la réponse Python 2 de xnor ...
Essayez tous les cas possibles
la source
CJam , 67 octets
Interprète en ligne: http://cjam.aditsu.net/
la source