Historia de fondo [que no es verdad]
Un piano está configurado así:
Sin embargo, en mi piano, ¡todas las teclas negras están rotas!
Sin embargo, todavía quiero poder tocar algunos acordes en mi piano roto.
En música, un acorde es un grupo de notas que se tocan juntas. Para permitir la entrada de acordes, primero definiré qué es un semitono.
¿Qué es un semitono?
Un semitono es la distancia más pequeña en la música occidental. Si observa la parte superior del piano, verá que generalmente puede pasar de una tecla negra a una tecla blanca, o viceversa; sin embargo, entre B
y C
y E
y F
no hay tecla negra.
¿Qué es un acorde?
Para los propósitos de este desafío, definimos un acorde como un grupo de notas con un cierto número de semitonos entre ellas. Por ejemplo, tomemos una toma en un 4-3-3
acorde que comienza C
(para la gente de la música, este es un acorde V 7 en fa mayor). Empezamos a C
. Contamos hasta 4 semitonos: C#
, D
, D#
, E
. La siguiente nota es E
, y contamos con 3 semitonos después de eso: F
, F#
, G
. La siguiente nota es G
, y contamos con 3 semitonos después de eso: G#
, A
, Bb
. Entonces, lo tenemos C-E-G-Bb
. ¡Hurra! Pero espera ... Bb
es una llave negra y esas están rotas ... Sin embargo, si comenzamos desde G
, ¡obtenemos G-B-D-F
! ¡Hurra!
Entrada
La entrada se proporciona como una lista de enteros en cualquier formato razonable. Esto representa el acorde como se describió anteriormente.
Salida
La salida debería ser una lista de notas en las que puedo comenzar a necesitar solo usar teclas blancas. Esto también puede ser una cadena de todas las hasta 7 notas porque todos los nombres clave serán un solo carácter. También debe poder manejar tener una salida vacía.
Casos de prueba
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
Otras especificaciones
- Lagunas estándar prohibidas
- Puede suponer que la entrada tiene al menos un número entero
- Puede suponer que todos los enteros no son negativos y tienen menos de 12 (porque el piano se repite cada 12 notas)
- La salida puede estar en cualquier orden
Criterios ganadores
Se aceptará la presentación válida más corta a partir del 15 de abril.
Respuestas:
Jalea , 25 bytes
Pruébalo en línea! o ver un conjunto de pruebas
¿Cómo?
fuente
MATL , 31 bytes
Gracias a Jonathan Allan por una corrección.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
El patrón
2 2 1 2 2 2 1
especifica los intervalos entre teclas blancas consecutivas. El programa utiliza un bucle que aplica todos los cambios cíclicos a este patrón básico, para probar cada tecla como una nota potencial más baja del acorde de entrada. Para cada turno, se obtiene la suma acumulativa del patrón. Por ejemplo,B
como la nota más baja potencial, el patrón se ha desplazado1 2 2 1 2 2 2
y su suma acumulativa es1 3 5 6 8 10 12
.Ahora, para ver si esto puede soportar un
4 3 3
acorde, calculamos la suma acumulativa de los intervalos de acordes, que es4 7 10
; reducirlo a través del módulo 12 basado en 1 (un intervalo de14
daría2
); y verifique si esos números son todos miembros de los valores permitidos1 3 5 6 8 10 12
. Ese no es el caso en este ejemplo. Si hubiera sido el caso, enviaríamos la cartaB
.La correspondencia entre los cambios cíclicos y las letras de salida está definida por la cadena
'BAGFEDC'
. Esto indica que'B'
(primer carácter) corresponde a un desplazamiento cíclico por1
;'A'
(segundo carácter) corresponde a un cambio cíclico por2
etc.fuente
Mathematica, 110 bytes (codificación ISO 8859-1)
Define una función unaria que
±
toma una lista de enteros como entrada (sin restricciones en el tamaño o signos de los enteros, en realidad) y devuelve una lista de cadenas de un carácter. Por ejemplo,±{3,4}
vuelve{"A","D","E"}
."A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#
es una función que convierte una lista de enteros en los nombres de las notas correspondientes, excepto que#
significa cualquier tecla negra. Esto se aplica a cada elemento deAccumulate[i~Prepend~#]&/@Range@12
, que crea una lista de valores de notas a partir de la lista de entrada de la lista de intervalos de notas, comenzando con cada posible nota del 1 al 12. Filtramos todas las listas de nombres de notas que contienen el"#"
usoSelect[...,FreeQ@"#"]
, y luego devuelva la primera nota en cada lista restante usando#&@@@
.fuente
+/-
símbolo.Accumulate[i~Prepend~#]&
porque, de lo contrario, habría un choque al curry. ¡Siéntete libre de encontrar una solución!Python 2,
159155bytes(Publicar esto después de asegurarse de que haya una presentación válida que sea más corta que esta)
Casi solo la solución trivial. Entradas como una lista de enteros y salidas con cada carácter en una línea individual.
-4 bytes eliminando una variable innecesaria
fuente
JavaScript (ES6),
727168 bytesRecorre cada tecla omitiendo las teclas negras, luego verifica que la suma acumulativa de semitonos nunca llegue a una tecla negra.
Editar: Guardado 3 bytes gracias a @Arnauld.
fuente