En teoría musical, un intervalo es la diferencia entre dos tonos. Cada tono se define por el número de medios pasos (La diferencia entre C y C #) o pasos completos (La diferencia entre C y D). Un paso completo es lo mismo que dos medios pasos. Aquí hay una lista de todos los intervalos predeterminados y el número de medios pasos que representan:
0 Perfect Unison
2 Major Second
4 Major Third
5 Perfect Fourth
7 Perfect Fifth
9 Major Sixth
11 Major Seventh
12 Perfect Octave
Hay 3 variaciones en los intervalos predeterminados, menores , disminuidos y aumentados .
Un intervalo menor es medio paso más bajo que un intervalo mayor, pero no es un intervalo perfecto. Entonces tienes un segundo menor (1), un tercero menor (3), un sexto menor (8) y un séptimo menor (10). No existe un cuarto menor, un quinto menor, unísono menor u octava menor, ya que todos estos son intervalos perfectos.
Un intervalo disminuido es medio paso más bajo que un intervalo menor o perfecto. Hay segundo disminuido (0), tercero disminuido (2), cuarto disminuido (4), quinto disminuido (6), sexto disminuido (7), séptimo disminuido (9) y octava disminuida (11).
Un intervalo aumentado es medio paso más alto que un intervalo mayor o perfecto. Hemos aumentado Unison (1), Aumento de segundo (3), Aumento de tercero (5), Aumento de cuarto (6), Aumento de quinto, (8), Aumento de sexto (10) y Aumento de séptimo (12).
El reto:
Debe escribir un programa o función que tome varios medios pasos o pasos completos y luego imprima una de las descripciones válidas en inglés de este intervalo. No importa qué descripción elija, siempre que coincida exactamente con la tabla IO. Puedes tomar esto como una cadena
"5w" == 5 whole steps
"3h" == 3 half steps
o como un número y una cadena / char.
5, "w" == 5 whole steps
3, "h" == 3 half steps.
Puede suponer que cada entrada tendrá entre 0 y 12 medios pasos.
Mesa IO
Aquí hay una lista completa que asigna el número de medios pasos a todas las salidas aceptables.
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
Aquí hay algunos ejemplos de E / S:
5w Minor Seventh
5h Augmented Third
12h Perfect Octave
12w UNDEFINED
1w Diminished third
2h Major Second
Respuestas:
Ruby, Rev B 138 bytes
5 bytes guardados al no repetir
Augmented/Diminished
. 1 byte guardado mediante el uso de?h
.Ruby, Rev A 144 bytes
La idea es minimizar el número de intervalos básicos (séptimo quinto tercio y solo al unísono) y aprovechar el hecho de que los séptimos y quintos tienen una relación análoga a la de los tercios y las uniones.
Hay cuatro tipos de séptimo / tercero y 3 tipos de quinto / unísono, por lo que la variable de índice
i
se establece en 12 menos el número de medios pasos, de modo que el primer término de la expresióni%7/4 + i/7*2
seleccionará correctamente el tipo de intervalo básico.sin golf en el programa de prueba
salida
Entradas de comportamiento indefinido: la función proporciona la respuesta correcta de
diminished union
-1 medios pasos, pero falla para las entradas superiores a 12. Por ejemplo, generaperfect unison
14 medios pasos, ya que el algoritmo se basa en un ciclo de 14 en lugar de 12.fuente
Python 2, 149 bytes
Primero, los pasos completos se convierten en medios pasos.
Entonces,
Diminished
vsAugmented
se imprime. Estos se alternan para adyacentes,n
excepto eso,n=5
yn=6
dan lo mismo, lo cual se logra al colocarlos primero en un módulo de límite un número impar.Finalmente, la distancia se imprime y se calcula mediante una tabla de búsqueda de tres bits. Esto es más corto que hacerlo
int('6746543230210'[n])
.fuente
Python 2.7, 155 bytes
fuente
Retina, 153 bytes
El número de entrada se convierte primero en unario, luego se duplica si se sigue
w
y se eliminan las letras, dejando solo el número unario. Este número se convierte de nuevo a decimal. Finalmente, se aplica alguna búsqueda y reemplazo para construir el resultado final.Ejecuciones de ejemplo:
Pruébalo en línea!
fuente
Vitsy , 166 bytes
Bueno, esto definitivamente puede ser más golfizado.
Esto funciona definiendo la cantidad mínima de elementos posibles, y luego llamando esos elementos a través de la sintaxis del método.
Pruébalo en línea!
fuente
Javascript 189 bytes
fuente
Java,
225224 bytesTiene que haber una mejor manera de empacar estas cadenas, pero no tengo ninguna idea.
Sangrado:
fuente
if(s=='w')i*=2;
coni*=s=='w'?2:1;