Entrada
El símbolo de cualquier acorde triádico (ver http://en.wikipedia.org/wiki/Chord_(music)#Triads ).
Salida
Las notas que constituyen el acorde dado.
Ejemplos
Entrada: AM
Salida:A C# E
Entrada: C#m
Salida:C# E G#
Entrada: Db+
Salida:C# F A
Entrada: C0
Salida:C D# F#
Bonos
-50 si también puedes lidiar con séptimos acordes
-150 para tocar realmente el sonido del acorde
-150 por usar caracteres imprimibles para mostrar cómo tocar el acorde en un piano; ejemplo para AM
:
┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│ │ │ │ │ ┃ ┃ │ │ ┃ ┃ │ │ │ │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘
-100 por usar caracteres imprimibles para mostrar cómo tocar el acorde en una guitarra; ejemplo para AM
:
x o o o o o
┌───┬───┬───┬───┬───┐
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
├───┼───┼───┼───┼───┤
│ │ █ █ █ │
├───┼───┼───┼───┼───┤
│ │ │ │ │ │
(ver https://en.wikipedia.org/wiki/Box-drawing_character )
Reglas
El resultado debe ser un programa o script de línea de comandos.
La entrada y la salida pueden ser de cualquier forma, siempre que sigan un estándar de notación musical.
Una representación de guitarra o piano se considera válida si y solo si contiene las tres (triádicas) o cuatro (séptimas) notas requeridas y nada más. La misma nota puede estar presente varias veces en el acorde.
Las bibliotecas externas no están permitidas, excepto para la generación de sonido (en cuyo caso
#include
, lasimport
directivas , ... no se agregan al recuento de caracteres).Este es el código de golf, ¡el código más corto gana!
Un poco de teoría musical ...
En la música tonal occidental moderna, cada octava se compone de doce notas sucesivas, a menudo señaladas:
A
A#
B
C
C#
D
D#
E
F
F#
G
G#
O:
La
La#
Si
Do
Do#
Re
Re#
Mi
Fa
Fa#
Sol
Sol#
En este sistema, consideramos que dos notas sucesivas (por ejemplo , A
y A#
, o E
y F
) están separadas por un semitono. Además, las notas son una especie de "bucle": lo que sigue inmediatamente G#
es A
.
Un acorde está constituido por unas pocas notas (2, 3, 4, a veces más) que "suenan bien juntas". Por ejemplo, los acordes triádicos contienen tres notas diferentes, y los acordes séptimos contienen cuatro notas diferentes.
Definamos los cuatro acordes triádicos como:
Tríada mayor : contiene la raíz del acorde (en esta pregunta, la nota dada como entrada), el tercio mayor para la raíz (4 semitonos más alto que la raíz) y el quinto perfecto para la raíz (7 semitonos más alto que la raíz ); esto se puede simbolizar 0-4-7
Tríada menor , simbolizada 0-3-7
Tríada aumentada , simbolizada 0-4-8
Tríada disminuida , simbolizada 0-3-6
Así, por ejemplo, si usted quiere hacer una tríada de Do mayor , señalado C
, CM
, Cmaj
, necesitará tres observó:
- 0: la raíz , en este caso un
C
- 4: el tercio menor , 4 semitonos más alto que la raíz; eso es un
E
- 7: el quinto perfecto , 7 semitonos más altos que la raíz: a
G
Esto es lo que el 0-4-7
, 0-3-7
, 0-4-8
y 0-3-6
anotaciones utilizadas por encima de media! Para los acordes séptimos, use el siguiente patrón:
¡Es todo por hoy! Ahora, sorpréndeme con un código increíble ... Si tienes alguna pregunta, agrega algunos comentarios a continuación.
Db+
es queDb F A
no hay D # o G allí. Tal vez sea un poco más de teoría de lo necesario, las fórmulas fueron la parte importante. Si realmente desea incluir los ocho acordes de séptima enumerados en wikipedia, debe especificar la entrada. Supongo que la producción de arte ascii del piano y la guitarra es flexible.Respuestas:
BBC BASIC
Emulator en bbcbasic.co.uk
Rev 1, 340 - 150 teclado - 150 jugando = 40
Aquí está la última versión, en la que logré incluir las siguientes mejoras al tiempo que alargué solo unos pocos caracteres más.
La entrada se puede editar cómodamente en la pantalla antes de presionar la tecla Intro (antes estaba usando GET $ para presionar una sola tecla, porque BBC Basic no le permite acceder a un solo carácter desde una cadena como si la cadena fuera una matriz. Ahora uso el Función MID $ voluminosa para extraer una cadena de un carácter dentro de la cadena.
Se muestran ambos lados del teclado, así como la línea completa entre E y F.
Para compensar los caracteres añadidos por lo anterior, reorganicé el programa para eliminar declaraciones de impresión innecesarias y eliminé un espacio en blanco que a primera vista parecía que no podía eliminarse. EN BBC Basic todas las funciones integradas son palabras reservadas, y puede poner un nombre de variable justo antes de ellas sin espacio en el medio. Los nombres de variables no pueden comenzar con una palabra reservada. Para que el programa sea menos confuso de leer, cambié todas las variables a minúsculas.
Aunque la presentación se ve mucho mejor, el siguiente programa ya está
totalmente desarrollado.(Vea la corrección a continuación.) Generalmente, las líneas nuevas y los dos puntos son intercambiables, excepto cuando se usa una declaración IF. En ese caso, todas las declaraciones en la misma línea (separadas por dos puntos) se ejecutarán condicionalmente. Las declaraciones posteriores a la nueva línea no están controladas por el IF y siempre se ejecutarán.Programa rev 1 340 caracteres
CORRECCIÓN: La BBC BASIC de RT Russell para Windows le permite eliminar algunas líneas nuevas y dos puntos, reduciendo el total a 327, ver más abajo. También tokeniza las palabras clave en caracteres individuales antes de guardar, reduciéndolo a 279.
Salida rev 1
Rev 0, 337 - 150 teclado - 150 jugando = 37Este es un concepto similar a mi respuesta de Arduino, pero siempre supe que podía superar ese conteo de bytes con BBC basic. Solo reconoce objetos punzantes, pero considera que B # no es válido, debe poner C. Esto podría solucionarse si realmente se considera importante.
Abandoné la idea de la guitarra y me concentré en mejorar el teclado. Ahora va de C a B, y he agregado en el lado izquierdo del teclado y la línea entre E y F. Eso cuesta 28 caracteres. El lado derecho no sería mucho más.
Aquí hay una salida de muestra, un acorde disminuido A # (que tiene un sonido bastante extraño en esta inversión) y un acorde mayor B. Tenga en cuenta que la entrada no se repite en la pantalla. Según la respuesta de Arduino, gire la pantalla hacia la izquierda para ver.
Versión sin golf
fuente
Como pueden ver, no intenté jugar golf en absoluto. Soy un geek de la música, y una de las cosas que más me molestan es cuando la gente escribe cosas usando la armónica incorrecta (por ejemplo, diciendo que un acorde C disminuido es CD # F # en lugar de C Eb Gb), así que escribí este programa que obtiene la armónica. Derecha. Lo hace representando cada nota como el número de quintas perfectas por encima de F.
Para lo que vale, si desea distinguir la enarmonía, cualquier intervalo musical puede representarse muy bien en un programa de computadora como una cantidad de quintos perfectos y una cantidad de octavas. Un cuarto aumentado, por ejemplo, es 6 quintos perfectos y -3 octavas, y un quinto disminuido es -6 quintos perfectos y 4 octavas.
Haskell, 441 caracteres
Algunas invocaciones de ejemplo:
fuente
Arduino
La entrada / salida se envía / recibe del Arduino a través de un puerto COM. Un usuario puede interactuar con esto a través de un terminal o el monitor serie en el IDE de Arduino. Como habrás adivinado por mi elección de plataforma, estoy planeando incluir la ejecución real del acorde (aunque todavía no lo he hecho).
He abordado la bonificación del teclado con éxito, y he tratado de abordar la guitarra, con un éxito limitado.
El cuadro de acordes viene en 130 bytes, que es demasiado largo para que valga la pena. Por lo tanto, he intentado otra forma, simplemente imprimiendo el estilo de Tabulación de números de trastes. Actualmente esto es 81 bytes para un bono de 81-100 = -19. Si este enfoque se considera válido, puedo intentar mejorarlo.
Los acordes utilizados son todas las formas de tipo D con la raíz en la 2da cuerda, la quinta en la 3ra cuerda y la tercera en la 1ra y 4ta cuerda. Las cuerdas 5 y 6 no se usan y marco esto con X a la derecha del cuadro de acordes (la izquierda sería más habitual, pero se pueden encontrar ejemplos marcados a la derecha).
Debido a que el programa considera que F es la nota más baja (para compatibilidad con el teclado mientras evita trastes excesivamente altos con esta forma de acorde), el acorde más alto es una E (con raíz en el traste 17). Ver ejemplo de salida.
El teclado tiene más éxito en términos de golf. Se ejecuta desde FE en lugar de CB por los motivos descritos anteriormente. Debe verse girando la pantalla un 90% en sentido antihorario, cuando puede ver claramente los contornos de las notas negras y la demarcación entre las notas blancas con
---
. La línea entre B y C podría extenderse con algunos____
por unos pocos bytes más.Intentaré tocar las notas a continuación. Esto será interesante porque, aunque creo que el Arduino Uno tiene 3 temporizadores internos, solo se puede reproducir una nota a la vez utilizando el comando de tono incorporado. Hay una función de biblioteca externa que usa todos los temporizadores de hardware (que estropearán el serial, pero de todos modos no será necesario en esa etapa). Alternativamente, puedo intentar producir los tonos en softare.
Si tengo éxito con eso, jugaré golf, pero no creo que sea el ganador general.
Código sin golf
Salida de muestra Cuanto menor sea el espacio entre las líneas de texto, mejor se verá. Por lo tanto, se ve muy bien cuando estoy editando la publicación, pero horrible en el cuadro gris después de la publicación. En cambio, publiqué una captura de pantalla del monitor serie Arduino que tiene un espacio intermedio entre líneas (y, por lo tanto, calidad de visualización)
fuente
Python3 - 315 char
Primera vez en codegolf! Solo admite acordes menores, mayores, disminuidos y aumentados en este momento.
fuente
'C C# D D# E F F# G G# A A# B'.split(' ')
lugar de su matriz literal para guardar algunos bytes.if('#'in a):j+=1
->if'#'in a:j+=1
= 2 caracteres menos para cada declaración. También cambiary
a unarange()
expresión también guarda algo. ¡Bienvenido! (y recuerde que las nuevas líneas también cuentan;))'C C# D D# E F F# G G# A A# B'.split()
;)y
para almacenar[1,2,4,5,6]
, ¿por qué no omitey
y reemplaza la línea 4 confor i in[1,2,4,5,6]:
? De todos modos, bienvenido a codegolf y espero que te diviertas aquí.Python 506 (unicode como 1 char) -150 (sonido) -150 (teclado) = 206
Para la reproducción de sonido, utiliza
pygame.midi
. Tenga en cuenta que elpygame.midi.get_default_output_id()
método no funciona muy bien. Por lo tanto, puede intentar cambiar la líneao=Output(get_default_output_id())
ao=Output(1)
,o=Output(2)
etc. Por lo general, el valor correcto está entre 0 y 5.Resultados
fuente
J - 82 char
Autocontenido, lee desde la entrada de la consola. Si necesita stdin, cambie el final
1
a a3
. No reclama bonificaciones y solo cubre las tríadas.En lugar de una nota aguda, por ejemplo
C#
, debe usar el nombre plano equivalenteDb
. (Corregir esto aumentaría el código en más de un bit). Los cuatro tipos de acordes son0
para disminuir,m
para menor,M
para mayor y+
para mayor.La lógica es la siguiente: utilizamos el último carácter para agregar un desplazamiento a la base 0-3-6, que selecciona el tipo de tercero y quinto. Mientras tanto, usamos la nota para encontrar de qué parte de la escala extraer las notas. El
;:
tanto hace que la nota compatible con la indexación en la escala desde el principio, y más tarde (por&.
) convierte las notas recogido en un espacio separado de cuerdas.Ejemplo de uso:
fuente
Javascript, 224 caracteres
Este es mi primer código de golf. Creo que puede ser más corto, pero no puedo encontrar bytes para guardar.
Soportes principales,
m
de menor importancia,0
para disminuida,+
para aumentarse o más 37 bytes paradim
,aug
.fuente
n[m]==0
puede ser simplemente!n[m]
. Lo mismo se aplica en otro lugar. Total, puedes cortar 6 caracteres fácilmente .n
es una cadena,n[m]==0
se convertirá0
en"0"
, por lo que es igual an[m]=="0"
."0" == 0
Es cierto, pero!"0"
es falso.AM
. Podría estar equivocado también.Python (
143134 caracteres)Mi primer desafío de golf :), no sé si se pueden eliminar algunos bytes más.
La notación utilizada aquí es * aug / + maj /, min / - dim
Merezco un punto extra por tener la constante 42 en el código: P
fuente
n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
Pitón 3: 257-150 = 107
¡Solo 25 caracteres demasiado para superar la solución J! Oh bien. Hay algunas buenas ideas aquí, creo.
La entrada es como los ejemplos, aunque debe usar nombres definidos en lugar de nombres planos. (por ejemplo, Gb debe ser F #)
La salida es una octava única de un piano, vista desde arriba y hacia la izquierda, con nombres de notas superpuestos. Debería ser solo un pequeño tramo de la imaginación.
fuente
CM
, deberíamos poder leerC E G
...bool(R)
conR|0
?bool(R)
es 1 (verdadero) si no está vacío, y 0 (falso) si está vacío. El|
operador no trabaja con listas ...Scala 537 caracteres - 50
fuente
Haskell, 273 caracteres
Resultados
fuente