Un diagrama de diapasón de guitarra se ve así:
0 1 2 3 4 5 6 7 8 9 10 11 12 <- Fret number (0 means it's open)
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
|-B--C--C#-D--D#-E--F--F#-G--G#-A--A#-B
|-G--G#-A--A#-B--C--C#-D--D#-E--F--F#-G
|-D--D#-E--F--F#-G--G#-A--A#-B--C--C#-D
|-A--A#-B--C--C#-D--D#-E--F--F#-G--G#-A
|-E--F--F#-G--G#-A--A#-B--C--C#-D--D#-E
Como puede ver, la primera cadena (desde arriba) abierta es un E
. El primer traste en la primera cadena es un F
. El cuarto traste en la tercera cuerda es a B
. Tenga en cuenta que la primera nota es el traste cero, no la primera.
Esto se puede escribir con números en el formato string, fret
. Las cadenas están numeradas del 1 al 6 de arriba a abajo. Los trastes están numerados del 0 al 12 de izquierda a derecha. El primero E
es por lo tanto 1, 0
. Algunos otros ejemplos:
1, 0 --> E
1, 1 --> F
3, 5 --> C
5, 1 --> A#
6, 6 --> A#
Desafío:
Tome N
pares de números ( s
y f
) y genere una sucesión de notas delimitadas.
- La entrada puede estar en cualquier formato adecuado. tuplas, matriz 2D, dos listas separadas, una lista entrelazada (string, fret, string, fret ...) etc.
- El tono de salida debe estar separado, pero el delimitador es opcional (coma, espacio, guión ...). La salida puede ser mayúscula o minúscula.
s
(para la cadena) estará en el rango[1, 6]
(puede optar por indexar i 0)f
(para traste) estará en el rango[0, 12]
Casos de prueba y ejemplos:
1 4 5 2 1 3 <- String
4 2 6 3 5 1 <- Fret
G# E D# D A G#
6 2 3 1 4 2 3 2 2 2 6 5 2
0 1 2 3 4 5 6 7 8 9 10 11 12
E C A G F# E C# F# G G# D G# B
3 3 3 3 3 3 3 3 3 3 3 3 3 <- String
0 3 5 0 3 6 5 0 3 5 3 0 0 <- Fret
G A# C G A# C# C G A# C A# G G
// The same test case, but different input and output format:
(3,0)(3,3)(3,5)(3,3)(3,6)(3,5)(3,0)(3,3)(3,5)(3,3)(3,0)(3,0)
G,A#,C,G,A#,C#,C,G,A#,C,A#,G,G
¡Buena suerte y feliz golf!
Respuestas:
05AB1E ,
48474340 bytesUtiliza la codificación CP-1252 .
Tanto las cadenas como los trastes están basados en 0.
Explicación
Pruébalo en línea!
Guardado 7 bytes gracias a Adnan
fuente
"AA#BCC#DD#EFF#GG#"•7V3•3BS£
en lugar de"A A# B C C# D D# E F F# G G#"#
es unos pocos bytes más corto :)."AA#BCC#DD#EFF#GG#"
cadena:•™ÎÚ,Ülu•žh'#A«‡
(ya que se permite minúsculas: p).JavaScript (ES6),
7970 bytesRequiere cadenas basadas en 1. Editar: ahorró 9 bytes calculando directamente la cadena para trasladar la conversión, según la respuesta anterior de @ nimi.
fuente
Mathematica, 62 bytes (no competitivos)
El
{24,19,15,10,5,0}
y elE2
representan los tonos de cuerda abierta de las seis cuerdas de guitarra (por ejemplo, la cuerda superior está 24 semitonos por encima de la nota E2). No compite porque no imprime los nombres de las notas, ¡ reproduce la secuencia de notas! (solo si tiene Mathematica, desafortunadamente) Por ejemplo,juega los primeros 4 compases del Canon de Pachelbel. (que es casi todo el Canon de Pachelbel que puedo soportar)
fuente
MATL ,
484745 bytesGracias a @Emigna por una corrección con respecto al formato de entrada.
Guitarra y golf de código ... ¡Tenía que responder a esta!
El formato de entrada es: una matriz de cadenas (basadas en 1), luego una matriz de trastes (basados en 0).
Pruébalo en línea!
Explicación
Algunas características del lenguaje utilizadas en esta respuesta:
Código comentado:
fuente
Java, 174
Sin golf:
fuente
C,
104103 bytesToma los números como
string fret
pares en stdin y genera la nota después de cada par. P.ej:fuente
Ruby, 63 bytes
toma una matriz de matrices de 2 elementos, en el orden
[string,fret]
.Explicación
En la afinación estándar, la guitarra es uno de los pocos instrumentos de cuerda (arqueados o con trastes) que tiene intervalos inconsistentes entre sus cuerdas. La mayoría tiene un intervalo constante de 5 semitonos entre todos los pares de cuerdas adyacentes (un "cuarto") o un intervalo consistente de 7 semitonos entre todos los pares de cuerdas adyacentes (un "quinto"). Estos corresponden a relaciones de frecuencia de 3: 4 y 2: 3 respectivamente, y son segundos en importancia solo a la "octava" con relación de frecuencia 1: 2.
La guitarra tiene principalmente intervalos de 5 semitonos. Si tuviera 5 de estos, tendría una diferencia de 25 semitonos entre la 1ra y la 6ta cuerda. En cambio, el intervalo entre la 2da y 3ra cuerda se reduce a 4 semitonos, dando una diferencia de 24 semitonos (2 octavas) que es mejor para tocar acordes.
Esto es inconveniente para el programa, por lo que comenzamos cambiando la entonación de guitarra indexada en 1 por una entonación de bajo de 5 cuerdas indexada en 0, que tiene todos los intervalos de 5 semitonos:
A continuación, agregamos 2 y damos la afinación de un bajo ficticio de 12 cuerdas, con la entonación de las cuerdas abiertas de la siguiente manera, y todos los intervalos son 5 semitonos (existen "bajos" de 12 cuerdas, pero no estoy seguro de que haya muchos con esto precisamente Afinación.)
Como se puede ver, todos los objetos punzantes se agrupan. Este patrón puede repetirse hasta el infinito. Se le conoce como el "círculo de quintas" y es fundamental para la escala musical occidental (con un poco de ajuste de sintonía del círculo puede ser cerrado debido al hecho de que
(3/2)**12
y2**7
son números muy similares.Ahora nos ocupamos del parámetro de traste. A diferencia de muchas otras respuestas aquí, que traducen el parámetro de cadena en varios trastes, yo traduzco el parámetro de traste en varias cadenas. En la tabla anterior se puede ver que sumar 7 al número de cadena nos coloca en una cadena cuyo nombre de nota es un semitono más alto. (Está en una octava completamente diferente, pero eso no importa). Entonces agregamos
i[1]*7
al número de cadena y tomamos el módulo 12:Restamos esto de 6 para obtener un número en el rango de 6 a -5 y buscamos la letra
BEADGCF
(Ruby permite que los índices negativos vuelvan al final de la matriz). Sin>=7
necesitamos agregar un#
símbolo para completar la salida .Programa de prueba
Salida
fuente
C #, 131 bytes
Ingrese dos listas separadas, las cadenas están basadas en 1.
fuente
Clora , 55 bytes
@T[0,7,2,10,5,0,7]+N%12@T[,A,A#,B,C#,D,D#,E,F,F#,G,G#]!
Explicación
@
modo numérico (lectura de entrada como números)T[0,7,2,10,5,0,7]
Transformar la entrada usando la matriz, ex matriz [Entrada]+N
Agregar N (siguiente valor de entrada) a la entrada actual%12
Módulo 12 el valor de entrada actual@
Marcar modo numérico desactivadoT[,A,A#,B,C#,D,D#,E,F,F#,G,G#]
Traduzca la entrada a una matriz!
Usar entrada como valor de salidafuente
Java 7
197163 bytesSin golf
fuente
Python 2,
94, 91, 88 bytesProbablemente hay algunas mejoras obvias por hacer. La entrada es una lista de pares, y las cadenas están indexadas en 0, por ejemplo:
fuente
Haskell,
8382 bytesToma una lista de cadenas y una lista de trastes, ambos indexados a 0. Ejemplo de uso:
De la lista infinita de notas que comienzan con
A#
, elimine el número de notas dadas por la lista[6,1,9,4,11,6]
en el índice de la cadena y elija la nota en el índice del traste de la lista restante.fuente
(s*7)+(s>2)
, así que ahora estoy usando eso en mi respuesta.JavaScript (ES6),
8281 bytesQuería probar una respuesta matemática, pero resultó un poco larga. Tal vez hay una manera de jugar al golf ...
Fragmento de prueba
Mostrar fragmento de código
fuente
toString(17)
pero luché por obtener un conteo de bytes razonable.PHP, 102 bytes
Ingrese como matriz múltiple, ambos basados en 0, por ejemplo, '[[2,0], [5,3], [2,12], [3,8], [0,3]]'
Alternativa agradable 106 Bytes para establecer el # basado en mod 7 congruente
fuente