El año es 930, y la Iglesia Gregoriana está teniendo un problema. Tienen miles de páginas de música de canto, pero el problema es que todas las partituras simplemente se arrojaron a una pila en lugar de tener un sistema de organización real:
Imagen del usuario gamerprinter en el Gremio de Cartógrafos .
La Iglesia necesita organizar todas las partituras, por lo que han contratado a un ingeniero de software medieval para escribir un programa para organizarlo para ellos. Usted es el ingeniero de software que ha sido contratado. Sin embargo, el proceso de compilación en la época medieval implica que el programa está escrito en papel por un equipo de escribas bíblicos lentos. Para disminuir el tiempo que le toma al equipo de escribanos compilar su código, debe hacer que el programa sea lo más pequeño posible.
La Iglesia quiere que la música del canto se organice en función de la escala musical en la que están escritos. Toda la música del canto de la Iglesia está escrita en escalas dorias . Dadas las notas de cierta pieza musical, su programa generará la escala Dorian en la que se encuentra. Aquí, explicaré exactamente qué es una escala Dorian. Si ya lo sabe, puede omitir esta sección.
Hay 12 notas posibles en cualquier melodía. Aquí están en orden:
C C# D D# E F F# G G# A A# B
Un semitono (representado mediante a S
) está incrementando un paso hacia la derecha, envolviéndose (de modo que un semitono desde B volvería a C). Un tono (representado con a T
) son dos semitonos. Por ejemplo, un semitono desde F # sería G. Un tono desde F # sería G #.
Para crear una escala Dorian, comenzamos desde cualquier nota en la lista, y luego avanzamos en el siguiente patrón, enumerando las notas que encontramos:
T, S, T, T, T, S
Un ejemplo. Comienzo de A. Las notas de mi escala Dorian se convierten en:
A
B (up a tone)
C (up a semitone)
D (up a tone)
E (up a tone)
F# (up a tone)
G (up a semitone)
La escala tiene las notas A, B, C, D, E, F #, y G. porque empecé desde A, vamos a llamar a esta la escala de Dorian en A . Por lo tanto, hay 12 escalas dorias diferentes, cada una de las cuales lleva el nombre de la nota desde la que comenzaron. Cada uno de ellos usa el mismo patrón de tonos y semitonos, comenzando desde una posición diferente. Si mi explicación no es coherente, también puede consultar Wikipedia .
La entrada del programa se puede dar desde lo que sea apropiado para su programa (por ejemplo, STDIN, argumento de línea de comando, raw_input()
). Puede no estar preinicializado en una variable. La entrada será una lista de notas separadas por comas, que representa la melodía de la pieza. Puede haber notas repetidas. Siempre habrá suficientes notas diferentes en la entrada para poder deducir decisivamente la escala de la pieza. Un ejemplo de entrada:
B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
La salida del programa debe ser la cadena Dorian scale in X
, donde X es la nota inicial de la escala. La salida de la entrada de ejemplo:
Dorian scale in B
Comparando esto con la escala Dorian en B ( B C# D E F# G# A
), vemos que todas las notas de la melodía están dentro de esta escala. La nota C # no se usa en este caso. Sin embargo, hay suficientes notas para identificar inequívocamente a B Dorian como la clave correcta. Ninguna otra escala Dorian encaja, porque cualquiera que sea la otra escala que intentemos, siempre hay al menos una nota de la melodía que no pertenece a la escala.
Este es el código de golf, por lo que gana la entrada con el menor número de caracteres. Pregunte en los comentarios si tiene preguntas.
Respuestas:
CJam - 61
Pruébalo en http://cjam.aditsu.net/
fuente
C,
171146Analizar cadenas en C no es tan fácil, así que opté por un enfoque más matemático.
Aprovecho el círculo de quintas. Si organizamos las notas en el siguiente orden en función de contar hasta 7 semitonos a la vez (conocido como "quinto"), encontramos que todas las notas permitidas en cualquier escala forman un bloque consecutivo de 7 notas y todas las notas prohibidas formar un bloque consecutivo de 5 notas.
(es un círculo, se envuelve
F
al final).La posición de una nota natural en la secuencia anterior se puede calcular como
(ASCII code) * 2 % 7
. Luego, si el siguiente carácter es impar (se aplica#
pero no a coma, espacio o byte cero), agregamos 7 para que sea nítido. Almacenamos un mapa de bits de las notas que se han utilizado.El número
243
(binario11111000
) corresponde a las notas prohibidas en la escala de A # Dorian. Lo multipliqué por(1<<12)+1=4097
para dar el número mágico1016056
. Esto se desplaza por derechos para verificar (mediante AND) si la melodía contiene notas prohibidas para cada una de las 12 escalas. Si la melodía no contiene notas prohibidas, se imprime la escala.Para la salida, necesitamos imprimir el nombre de la escala codificado en el orden inverso al ciclo de quintos anterior, recuerde que estamos retrocediendo porque estamos desplazando los derechos). La secuencia ASCII
ADGCFBEADGCF
es generada por65+i*3%7
. Para los primeros cinco de estos también debe imprimirse un filo.Código sin golf
Comportamiento de entrada no válido: si se suministran notas insuficientes para determinar inequívocamente la escala, generará todas las escalas posibles. Si se proporciona una combinación imposible de notas, no generará nada. Las notas deben estar delimitadas por una coma (u otro carácter que no sea un espacio en blanco con un código ASCII par <= 64). Los espacios no se pueden usar ya que todo después del primer espacio se consideraría un argumento diferente. Los códigos ASCII> 64 se interpretarán como notas de la manera descrita.
fuente
Haskell - 152
Sin golf
fuente
Python 2 - 177 caracteres
No es tan corto, pero Python cree que es divertido escribir múltiples bucles anidados en una línea, incluso cuando no se juega al golf. Desafortunadamente, tuve que poner la declaración de entrada en una línea separada para que no se ejecute más de una vez.
No uso Python 3, pero creo que esta es una instancia rara cuando la declaración de impresión no necesitaría más caracteres. Dado que
print
es una función allí, podría compensar la necesidad de paréntesis con el uso del*
operador de desempaquetado de listas para reemplazar el último[0]
.fuente
input
porraw_input
y guardar 4 caracteres en Python 3.Rubí - 132
Entrada de la línea de comando args.
p.ej
ruby dorianscale.rb B,B,D,E,D,B,A,G#,A,G#,E,D,F#,E,F#,E,F#,G#,A
Pruébalo en: ideone
fuente
Haskell - 140
Utilice la propiedad Circle of Fifths introducida por @steveverrill. Si dejamos
circle0 = words "C G D A E B F# C# G# D# A# F"
ycircle = circle0 ++ circle0
, entonces podemos construir todas las escalas tomando 7 notas consecutivascircle
.En cada escala construida de esta manera
scale !! 3
, el cuarto elemento es el nombre de la escala.Código
Sin golf
fuente
Scala
130128127Usando el método del círculo de quintas. Entrada de la línea de comando args es decir
fuente