La escala mayor (o escala jónica) es una de las escalas musicales más utilizadas, especialmente en la música occidental. Es una de las escalas diatónicas. Al igual que muchas escalas musicales, se compone de siete notas: la octava duplica la primera al doble de su frecuencia, por lo que se llama una octava más alta de la misma nota.
Las siete notas musicales son:
C, D, E, F, G, A, B , C (repetido por ejemplo)
Una escala mayor es una escala diatónica. Tome la sucesión previa de notas como una escala mayor (en realidad, es la escala C mayor) . La secuencia de intervalos entre las notas de una escala mayor es:
entero, entero, medio, entero, entero, entero, medio
donde "entero" representa un tono completo (una curva roja en forma de U en la figura), y "medio" representa un semitono (una línea roja discontinua en la figura).
En este caso, de C a D existe un tono completo , de D a E existe un tono completo , de E a F existe medio tono, etc.
Tenemos 2 componentes que afectan la distancia de tono entre notas. Estos son el símbolo Sharp (♯) y el símbolo plano (♭).
El símbolo de Sharp (♯) agrega medio tono a la nota. Ejemplo. De C a D mencionamos que existe un tono completo, si usamos C♯ en lugar de C, entonces de C♯ a D existe un medio tono.
El símbolo Flat (♭) hace lo contrario del símbolo Sharp, resta medio tono de la nota. Ejemplo: de D a E mencionamos que existe un tono completo, si usamos Db en su lugar D, entonces de Db a E existe un tono y medio.
Por defecto, de nota a nota existe un tono completo, excepto para E to F
y B to C
en donde solo existe medio tono.
Tenga en cuenta que, en algunos casos, el uso de tonos enarmónicos puede crear un equivalente a una Escala mayor. Un ejemplo de esto es C#, D#, E#, F#, G#, A#, B#, C#
dónde E#
y B#
son enarmónicos, pero la escala sigue la secuencia de una Escala mayor.
Desafío
Dada una escala, genera un valor verdadero si es una Escala mayor o equivalente, de lo contrario, genera un valor falsey.
Reglas
- Método de E / S estándar permitido
- Aplican reglas estándar de código de golf
- No es necesario tener en cuenta la octava nota. Suponga que la entrada solo constará de 7 notas
- Suponga que el doble plano (♭♭), el doble afilado (♯♯) o el signo natural (♮) no existen
Casos de prueba
C, D, E, F, G, A, B => true
C#, D#, E#, F#, G#, A#, B# => true
Db, Eb, F, Gb, Ab, Bb, C => true
D, E, Gb, G, A, Cb, C# => true
Eb, E#, G, G#, Bb, B#, D => true
-----------------------------------------------
C, D#, E, F, G, A, B => false
Db, Eb, F, Gb, Ab, B, C => false
G#, E, F, A, B, D#, C => false
C#, C#, E#, F#, G#, A#, B# => false
Eb, E#, Gb, G#, Bb, B#, D => false
fuente
Respuestas:
Perl 6 ,
76656359 bytes-4 bytes gracias a Phil H
Pruébalo en línea!
Explicación
fuente
Node.js v10.9.0 ,
78767169 bytesPruébalo en línea!
¿Cómo?
Cada notanorte se convierte en un número negativo en [−118,−71] con:
Lo que da:
Calculamos las diferencias por pares del módulo12 entre estos valores.
La diferencia más baja posible entre 2 notas es−47 , por lo que es suficiente agregar 4 × 12=48 antes de aplicar el módulo para asegurarse de obtener un resultado positivo.
'#'
'b'
fuente
JavaScript (Node.js) ,
150131125 bytesPruébalo en línea!
-19 bytes gracias a Luis felipe
-6 bytes gracias a Shaggy
Sin golf:
fuente
[...'C0D0EF0G0A0B']
en lugar de'C0D0EF0G0A0B'.split('')
y en+""
lugar de.toString()
guardar algunos bytesx[1]=='#'|-(x[1]=='b')
en lugar dex[1]=='#'?1:(x[1]=='b'?-1:0)
guardar algunos bytes también-10 % 12 == 2
. Aunque ahora que lo pienso, esto podría fallar en algunos casos ...Dart ,
198 197196189 bytesPruébalo en línea!
Puerto suelto de la antigua respuesta de Perl 6 /codegolf//a/175522/64722
Versión antigua :
Dart , 210 bytes
Pruébalo en línea!
Sin golf:
Un paso completo es 2, un cuarto es 1. Mod 12 en caso de que saltes a una octava más alta. Itera a través de todas las notas y calcula la diferencia entre la nota i-ésima y la nota i-1. Concatena el resultado y debe esperar 221222 (2 enteros, 1 mitad, 3 enteros).
fuente
i=1
ai=0
puede reducir un byte cambiandofor(;i<7;i++)
afor(;++i<7;)
. Además, los soportes{}
pueden retirarse alrededor de ese bucle, poniendo elj+=...
interior de la tercera parte del bucle:for(;++i<7;j+='${(y[0]-y[1])%12}')
. Y una última cosa está cambiandoreturn j=='221222';
parareturn'221222'==j;
deshacerse del espacio. -6 ( 210 bytes ) después de estas modificaciones.if(k>9)k--;if(k>3)k--;
ak-=k>3?k>9?2:1:0;
yk+=m.length<2?0:m[1]=='#'?1:m[1]=='b'?-1:0;return k;
parareturn m.length<2?k:m[1]=='#'?k+1:m[1]=='b'?k-1:k;
. :)C (gcc) ,
-DA=a[i]
+ 183 = 191 bytesPruébalo en línea!
Basado en la respuesta de Perl.
Toma la entrada como una cadena ancha.
Sin golf:
fuente
[Paquete Wolfram Language (Mathematica) + Music`], 114 bytes
Me encanta la música y me pareció interesante, pero estaba jugando al golf de verdad cuando esta oportunidad de golf de código surgió, así que mi presentación se retrasa un poco.
Pensé que probaría esto de una manera totalmente diferente, utilizando algunos conocimientos musicales reales. Resulta que el paquete de música de Mathematica conoce la frecuencia fundamental de las notas nombradas. Primero convierto la cadena de entrada en una secuencia de notas con nombre. A continuación, tomo las proporciones de cada nota sucesiva y doblo las que son menores de 2 (para tener en cuenta el desplazamiento de octava). Luego comparo estas proporciones con las proporciones de la escala jónica, que tiene aproximadamente una diferencia de frecuencia de 6% entre medias notas y 12% entre notas completas.
Más de la mitad de los bytes gastados aquí son para convertir la entrada en símbolos con nombre.
Pruébalo en línea!
fuente
Python 3 ,
175136134114112 bytesPruébalo en línea!
Una implementación de Python 3 de una sola línea.
Gracias a @Arnauld por la idea de calcular tonos usando división y módulo.
Gracias a @Jo King por -39 bytes.
fuente
[Python]
269202 bytesMejoras de
Jo King
:¡Intentalo!
Sin golfista, con piloto de prueba:
fuente
Ruby , 109 bytes
Pruébalo en línea!
fuente