En théorie musicale, un intervalle est la différence entre deux hauteurs. Chaque pas est défini par le nombre de demi-pas (la différence entre C et C #) ou de pas entiers (la différence entre C et D). Une étape entière équivaut à deux demi-étapes. Voici une liste de tous les intervalles par défaut et du nombre de demi-pas qu'ils représentent:
0 Perfect Unison
2 Major Second
4 Major Third
5 Perfect Fourth
7 Perfect Fifth
9 Major Sixth
11 Major Seventh
12 Perfect Octave
Il existe 3 variations sur les intervalles par défaut, mineures , diminuées et augmentées .
Un intervalle mineur est inférieur d'un demi-pas à un intervalle majeur, mais pas un intervalle parfait. Vous avez donc une seconde mineure (1), une troisième mineure (3), une mineure sixième (8) et une mineure septième (10). Il n'y a pas de quatrième mineur, cinquième mineur, unisson mineur ou octave mineure, car ce sont tous des intervalles parfaits.
Un intervalle diminué est inférieur d'un demi-pas à un intervalle mineur ou parfait. Il y a la seconde diminuée (0), la troisième diminuée (2), la quatrième diminuée (4), la cinquième diminuée (6), la sixième diminuée (7), la septième diminuée (9) et l'octave diminuée (11).
Un intervalle augmenté est un demi-pas plus haut qu'un intervalle majeur ou parfait. Nous avons l'union augmentée (1), la seconde augmentée (3), la troisième augmentée (5), la quatrième augmentée (6), la cinquième augmentée, (8), la sixième augmentée (10) et la septième augmentée (12).
Le défi:
Vous devez écrire un programme ou une fonction qui prend un certain nombre de demi-étapes ou des étapes entières, puis imprime l' une des descriptions anglaises valides de cet intervalle. Peu importe la description que vous choisissez, tant qu'elle correspond exactement à la table d'E / S. Vous pouvez prendre cela comme une chaîne
"5w" == 5 whole steps
"3h" == 3 half steps
ou sous forme de nombre et de chaîne / caractère.
5, "w" == 5 whole steps
3, "h" == 3 half steps.
Vous pouvez supposer que chaque entrée sera comprise entre 0 et 12 demi-pas.
Table IO
Voici une liste complète mappant le nombre de demi-étapes à toutes les sorties acceptables.
0 Perfect unison, Diminished second
1 Minor second, Augmented unison
2 Major second, Diminished third
3 Minor third, Augmented second
4 Major third, Diminished fourth
5 Perfect fourth, Augmented third
6 Diminished fifth, Augmented fourth
7 Perfect fifth, Diminished sixth
8 Minor sixth, Augmented fifth
9 Major sixth, Diminished seventh
10 Minor seventh, Augmented sixth
11 Major seventh, Diminished octave
12 Perfect octave, Augmented seventh
Voici quelques exemples d'E / S:
5w Minor Seventh
5h Augmented Third
12h Perfect Octave
12w UNDEFINED
1w Diminished third
2h Major Second
Réponses:
Ruby, Rev B 138 octets
5 octets enregistrés en ne se répétant pas
Augmented/Diminished
. 1 octet enregistré en utilisant?h
.Ruby, Rev A 144 octets
L'idée est de minimiser le nombre d'intervalles de base (septième cinquième tiers et à l'unisson seulement) et de profiter du fait que les septièmes et les cinquièmes ont une relation analogue à celle entre les tiers et les unisons.
Il existe quatre types de septième / troisième et 3 types de cinquième / unisson, de sorte que la variable d'index
i
est définie sur 12 moins le nombre de demi-pas, de sorte que le premier terme de l'expressioni%7/4 + i/7*2
sélectionne correctement le type d'intervalle de base.non golfé dans le programme de test
production
Entrées de comportement indéfinies: la fonction donne la bonne réponse
diminished union
pour -1 demi-pas, mais échoue pour les entrées supérieures à 12. Par exemple, elle génèreperfect unison
14 demi-étapes, car l'algorithme est basé sur un cycle de 14 plutôt que de 12.la source
Python 2, 149 octets
Tout d'abord, des étapes entières sont converties en demi-étapes.
Ensuite,
Diminished
vsAugmented
est imprimé. Ceux-ci alternent pour adjacentsn
sauf celan=5
etn=6
donnent le même, ce qui est obtenu en les plaçant d'abord à travers un module modulo limite un nombre impair.Enfin, la distance est imprimée, calculée via une table de recherche à trois bits. C'est plus court que de le faire
int('6746543230210'[n])
.la source
Python 2.7, 155 octets
la source
Rétine, 153 octets
Le numéro d'entrée est d'abord converti en unaire, puis doublé s'il est suivi de
w
, et toutes les lettres sont supprimées, ne laissant que le numéro unaire. Ce nombre est ensuite reconverti en décimal. Enfin, une recherche et un remplacement sont appliqués pour construire la sortie finale.L'exemple s'exécute:
Essayez-le en ligne!
la source
Vitsy , 166 octets
Eh bien, cela peut certainement être approfondi.
Cela fonctionne en définissant la quantité minimale d'éléments possible, puis en appelant ces éléments via la syntaxe de la méthode.
Essayez-le en ligne!
la source
Javascript 189 octets
la source
Java,
225224 octetsIl doit y avoir une meilleure façon d'emballer ces cordes mais je n'ai aucune idée.
Dentelé:
la source
if(s=='w')i*=2;
pari*=s=='w'?2:1;