Avant de partir, vous n'avez pas besoin de comprendre beaucoup de notation musicale pour relever ce défi.
EXPLICATION
Dans les partitions standard, les doubles clés traversent la page et servent de points de référence aux notes, vous permettant de savoir quelle note doit être jouée. Si vous n'êtes pas déjà familier avec la clé de sol et de basse, voici une description de Wikipedia:
Une clef est un symbole musical utilisé pour indiquer la hauteur des notes écrites. Placé sur l'une des lignes au début de la portée, il indique le nom et la hauteur des notes sur cette ligne. Cette ligne sert de point de référence par lequel les noms des notes sur toute autre ligne ou espace de la portée peuvent être déterminés.
Dans l'image ci-dessus, la moitié supérieure des lignes est la clé de sol, notée d'un
La moitié inférieure est la clef de basse, notée d'un
Comme vous pouvez le voir sur les aigus sur une note clé le plus bas en ligne est un E . (Je ne compte pas les notes en dehors des lignes pour ce défi clef) Sur la clef basse, la ligne la plus basse est un G . Pour relever ce défi, vous devez procéder comme suit:
DÉFI
Étant donné une entrée sous l'une des formes suivantes (votre choix), convertissez-la en clé opposée. Que ce soit la clé de sol ou la clé de basse peut être une valeur Truthey / Falsey dans votre langue (pas seulement deux valeurs), par exemple
F # T ou F # True ou F # Treble
mais non
F # -1 ou F # 4
Les espaces et les majuscules sont facultatifs, les plats n'apparaissent pas et les espaces de fin ne sont pas autorisés.
Input Expected Output
E Treble G
F Treble A
F# Treble A#
G Treble B
G# Treble C
A Treble C
A# Treble C#
B Treble D
C Treble E
C# Treble F
D Treble F
D# Treble F#
E Treble G
F Treble A
F# Treble A#
G Bass E
G# Bass F
A Bass F
A# Bass F#
B Bass G
C Bass A
C# Bass A#
D Bass B
D# Bass C
E Bass C
F Bass D
F# Bass D#
G Bass E
G# Bass F
A Bass F
A# Bass F#
Soyez prévenu, ce n'est pas un défi trivial de différence constante. Regardez attentivement les entrées et les sorties. Si vous regardez un piano,
les touches noires sont tranchantes, désignées par #. Notez qu'il n'y a ni E # ni B #. Cela signifie que si on vous donne G # sur la clé de basse, au lieu de retourner E # , vous devez retourner F
Il s'agit de code-golf , donc le plus petit nombre d'octets gagne.
la source
C
place deC
) vont bien?1
et-1
(ou même de dire,4
et-4
) pour l'entrée d'indicateur de clé est-elle autorisée ou serait-ce acceptable uniquement s'il s'agit de valeurs véridiques / falsey dans notre langue?Réponses:
Gelée ,
3534 octetsJ'ai le sentiment qu'un peu d'arithmétique pourrait gagner cette méthode.
Essayez-le en ligne!
Un programme complet prenant respectivement 1) l'indicateur de clé
0
ou1
pour Bass ou Treble et 2) la note; et imprimer la note résultante.Serait de 31 octets si
-4
et4
étaient acceptables comme valeurs d'entrée de l'indicateur de clé (Ñi+_⁸?4ị¢
peuvent alors devenirÑi+⁸ị¢
) mais cela a été clarifié comme non autorisé à moins que -4 soit falsey et 4 soit véridique, ce qui n'est pas le cas pour Jelly.Comment?
Construit un clavier avec fantôme
B#
etE#
touches, trouve l'index de l'entrée, compense que par4
dans la direction requise, indexe de nouveau dans un clavier avec ces touches fantômes remplacées par leurs résultats requis (la touche au-dessus d'eux):la source
Befunge,
7064 octetsEssayez-le en ligne!
L'entrée doit être sous la forme
C# Treble
ouF Bass
, bien que la clé puisse simplement être la première lettre (c'estT
-à- dire ouB
), car le reste de l'entrée est de toute façon ignoré.Explication
À la suite de cette modification de code, la prochaine séquence d'instructions prendra l'une des deux formes suivantes:
À ce stade, la pile contient
note,0,sharp,space
ounote,0,space
.À ce stade, la pile contient
note,0
ou justenote
(avec un zéro implicite ci-dessous).la source
Perl 5, 56 octets
Lit la note et la clé sur deux lignes de STDIN et imprime la nouvelle note dans STDOUT. La clé est
0
pour les aigus et1
pour les basses.la source
-p
indicateur tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/…JavaScript (ES6) 74 octets
Prend entrée dans la syntaxe curryfication
(note)(clef)
oùclef
est0
pour la basse et1
des aigus .Démo
Afficher l'extrait de code
Comment?
C'est en fait un peu moins amusant que ma version précédente, mais la table de recherche sous-jacente est maintenant
F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,F
ce qui permet de raccourcir la condition # tout en évitant l' astuce de caractère NUL - qui était un peu limite, je suppose.Version précédente
7675 octetsDémo
Afficher l'extrait de code
Comment?
L'entrée (n, c) est traitée par les étapes suivantes:
Nous évaluons d'abord
4 * !!n[1] + c + n
où!!n[1]
est vrai (contraint à 1 ) si la note contient un # , et faux (contraint à 0 ) sinon. L'expression4 * !!n[1] + c
donne une valeur numérique qui est ajoutée devant la chaîne n .Étape implicite: les zéros de tête et les # de fin sont ignorés par
parseInt()
. Par exemple,"5G#"
est en fait analysé comme"5G"
.Nous convertissons la nouvelle chaîne en une valeur décimale en l'analysant comme une quantité de base 21.
Nous appliquons modulo 24.
Nous appliquons modulo 17.
Vous trouverez ci-dessous le tableau récapitulatif de toutes les paires d'entrées possibles, ainsi que la sortie attendue. Notez qu'un # doit être ajouté à la sortie si le résultat final est 0 , 2 , 3 ou 5 . D'où l'utilisation du masque binaire 101101 ( 45 en décimal).
la source
Python 2 , 77 octets
Fonction qui imprime vers
STDOUT
.True
convertit les graves en aigus etFalse
convertit les aigus en graves.Essayez-le en ligne!
Explication:
N=ord(n[0])-63-4*c;
calcule l'indice (0 à 7) de la lettre de la nouvelle note, sans tenir compte des objets tranchants.ord(N[0])-63-4*c
obtient l'index de la lettre actuelle et ajoute ou soustrait 2 selon la valeur dec
(variable pour basculer dans le sens de la conversion)M=-~N%3<1<len(n);
calcule si cette variable devra ou non être ajustée. Par exemple, si la nouvelle note estE
, et la note d'origine avait une forte, cela devra être ajusté à unF
. L'inégalité chaînée fonctionne comme suit:-~N%3<1
vérifie si l'index de la nouvelle note est dans la séquence3n-1
. Cela ne donnera que vrai pourE
etB
, les deux notes qui n'ont pas de forte.1<len(n)
vérifie si la note d'origine avait une forte (ce qui rendrait la longueur de la chaîne supérieure à 1). Cela est nécessaire car, s'il n'y avait pas de netteté, il n'est pas nécessaire d'ajuster les nouvelles lettres de note.M
à soitTrue
ouFalse
, qui peut être utilisé dans le calcul comme1
et0
respectivement, donc pour effectuer l'ajustement, il suffit d'ajouter M à N et modulo par 7.chr((N+M)%7+65)
ajoute l'ajustement si nécessaire, puis reconvertit la valeur d'un index en caractère.+n[1:2-M]
ajoutera un symbole pointu si les deuxM=0
(aucun ajustement n'a été effectué) et la valeur d'origine avaient également une valeur pointue.la source
Java 8, 119 octets
Explication:
Essayez-le ici.
la source
n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
R , 111 octets
Essayez-le en ligne!
Non golfé:
la source