Backstory [ce qui n'est pas vrai]
Un piano est configuré comme ceci:
Cependant, sur mon piano, toutes les touches noires sont cassées!
Je veux quand même pouvoir jouer des accords sur mon piano cassé.
En musique, un accord est un groupe de notes jouées ensemble. Pour permettre la saisie d'accords, je vais d'abord définir ce qu'est un demi-ton.
Qu'est-ce qu'un demi-ton?
Un demi-ton est la plus petite distance dans la musique occidentale. Si vous regardez la partie supérieure du piano, vous voyez que vous pouvez généralement passer d'une touche noire à une touche blanche, ou vice versa; cependant, entre B
et C
et E
et F
il n'y a pas de clé noire.
Qu'est-ce qu'un accord?
Pour les besoins de ce défi, nous définissons un accord comme un ensemble de notes avec un certain nombre de demi-tons entre elles. Par exemple, prenons un 4-3-3
accord avec un accord commençant C
(pour les musiciens, il s'agit d'un accord V 7 en fa majeur). Nous commençons à C
. Nous comptons jusqu'à 4 demi - tons: C#
, D
, D#
, E
. La note suivante est E
, et nous comptons 3 demi - tons après: F
, F#
, G
. La note suivante est G
, et nous comptons 3 demi - tons après: G#
, A
, Bb
. Donc, nous obtenons C-E-G-Bb
. Yay! Mais attendez ... Bb
est une clé noire et ceux-ci sont cassés ... Cependant, si nous partons de G
, nous obtenons G-B-D-F
! Yay!
Contribution
L'entrée est donnée sous la forme d'une liste d'entiers dans n'importe quel format raisonnable. Cela représente l'accord tel que décrit ci-dessus.
Production
La sortie devrait être une liste de notes sur lesquelles je ne peux commencer qu'à utiliser des touches blanches. Il peut également s'agir simplement d'une chaîne de 7 notes au maximum, car tous les noms clés seront composés d'un seul caractère. Vous devez également pouvoir gérer une sortie vide.
Cas de test
input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh
Autres spécifications
- Échappatoires standard interdites
- Vous pouvez supposer que l'entrée a au moins un entier
- Vous pouvez supposer que tous les nombres entiers sont non négatifs et inférieurs à 12 (car le piano répète toutes les 12 notes)
- La sortie peut être dans n'importe quel ordre
Critères gagnants
La soumission valide la plus courte au 15 avril sera acceptée.
Réponses:
Gelée , 25 octets
Essayez-le en ligne! ou voir une suite de tests
Comment?
la source
MATL , 31 octets
Merci à Jonathan Allan pour une correction.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Le motif
2 2 1 2 2 2 1
spécifie les intervalles entre les touches blanches consécutives. Le programme utilise une boucle qui applique tous les décalages cycliques à ce modèle de base, afin de tester chaque touche en tant que note la plus basse potentielle de l'accord d'entrée. Pour chaque quart de travail, la somme cumulée du motif est obtenue. Par exemple, pour laB
note la plus basse potentielle, le motif a été déplacé vers1 2 2 1 2 2 2
et sa somme cumulée est1 3 5 6 8 10 12
.Maintenant, pour voir si cela peut supporter un
4 3 3
accord, nous calculons la somme cumulée des intervalles d'accord, qui est4 7 10
; le réduire via le modulo 12 basé sur 1 (un intervalle de14
donnerait2
); et vérifiez si ces nombres sont tous membres des valeurs autorisées1 3 5 6 8 10 12
. Ce n'est pas le cas dans cet exemple. Si tel avait été le cas, nous publierions la lettreB
.La correspondance entre les décalages cycliques et les lettres de sortie est définie par la chaîne
'BAGFEDC'
. Cela indique que'B'
(premier caractère) correspond à un décalage cyclique de1
;'A'
(deuxième caractère) correspond à un décalage cyclique de2
etc.la source
Mathematica, 110 octets (codage ISO 8859-1)
Définit une fonction unaire
±
prenant une liste d'entiers en entrée (aucune restriction sur la taille ou les signes des entiers, en fait) et retourne une liste de chaînes à un caractère. Par exemple,±{3,4}
renvoie{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
est une fonction qui transforme une liste d'entiers en noms de note correspondants, sauf qu'elle#
représente toute touche noire. Ceci est appliqué à chaque élément deAccumulate[i~Prepend~#]&/@Range@12
, qui établit une liste de valeurs de note à partir de la liste d'entrée de liste des intervalles de note, en commençant par chaque note possible de 1 à 12. Nous filtrons toutes les listes de noms de notes qui contiennent"#"
usingSelect[...,FreeQ@"#"]
, puis retourner la première note de chaque liste restante en utilisant#&@@@
.la source
+/-
symbole.Accumulate[i~Prepend~#]&
car sinon il y aurait un affrontement curry. N'hésitez pas à trouver une solution de contournement!Python 2,
159155 octets(Publier ceci après vous être assuré qu'il existe une soumission valide plus courte que celle-ci)
À peu près juste la solution triviale. Entrées sous forme de liste d'entiers et de sorties avec chaque caractère sur une ligne individuelle.
-4 octets en supprimant une variable inutile
la source
JavaScript (ES6),
727168 octetsBoucle à travers chaque touche en omettant les touches noires, puis en vérifiant que la somme cumulée des demi-tons n'atteint jamais une touche noire.
Edit: sauvé 3 octets grâce à @Arnauld.
la source