Pautas
Tarea
Dadas dos notas, ingresadas como cadenas o listas / matrices, calcule cuántos semitonos están separados (incluidas las notas en sí mismas), generando un número.
Explicación de un semitono:
Un semitono es un paso hacia arriba o hacia abajo del teclado. Un ejemplo es C a C #. Como puede ver a continuación, la nota C está en una nota blanca y C # es la nota negra, justo una arriba. Los semitonos son los saltos de una nota negra a la siguiente nota blanca, hacia arriba o hacia abajo, excepto por:
- B a C
- C a B
- E a F
- F a E
Ejemplos
'A, C' -> 4
'G, G#' -> 2
'F#, B' -> 6
'Bb, Bb' -> 13
Reglas
- La mayor distancia entre dos notas es de 13 semitonos.
- La segunda nota ingresada siempre estará por encima de la primera nota ingresada.
- Puede tomar la entrada como una cadena o como una matriz / lista. Si lo toma como una cadena, las notas estarán separadas por comas (por ejemplo
String -> 'A, F'
,Array -> ['A', 'F']
). - Puede suponer que siempre recibirá dos notas válidas.
- Los objetos punzantes se denotarán como
#
y los planos se denotarán comob
- Su código debe admitir equivalentes enarmónicos (por ejemplo, debe admitir F # y Gb)
- Su código no necesita admitir notas con nombres, pero se puede nombrar sin una nitidez o un plano (es decir, no necesita admitir E # o Cb). Sin embargo, puntos de bonificación si su código lo admite.
- Su código no necesita admitir objetos punzantes dobles o planos dobles.
- Puede suponer que si obtiene las mismas notas o el mismo tono (por ejemplo, 'Gb, Gb' o 'A #, Bb'), el segundo no será exactamente una octava por encima del primero.
- Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes.
G -> G#
porque ambos están incluidos.Cb
oE#
? ¿Qué pasa con los objetos punzantes / pisos dobles?(X, Y]
modo que C a C # sea 1 semitono y C a C sea 12 semitonos.Respuestas:
Python 2 , 66 bytes
Pruébalo en línea!
Python 2 , 68 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 78 bytes
Guardado 1 byte gracias a @Neil
Toma las notas en sintaxis curry
(a)(b)
.Casos de prueba
Mostrar fragmento de código
Función hash
El propósito de la función hash es convertir una nota en un puntero en una tabla de búsqueda que contiene las compensaciones de semitonos (C = 0, C # = 1, ..., B = 11), almacenadas en hexadecimal.
Nos primera append un '3' a la nota y analizar la cadena resultante en base 36, que conduce a un número entero N . Debido a que '#' es un carácter no válido, simplemente se ignora, junto con cualquier carácter que lo siga.
Luego calculamos:
A continuación se muestra un resumen de los resultados.
Sobre pisos y objetos punzantes
A continuación se muestra la prueba de que esta función hash asegura que una nota seguida de un '#' dé el mismo resultado que la siguiente nota seguida de una 'b' . En este párrafo, usamos el prefijo @ para cantidades de base 36.
Por ejemplo, Db se convertirá a @ db3 y C # se convertirá a @c (consulte el párrafo anterior). Queremos demostrar que:
O en el caso general, con Y = X + 1 :
@ b3 es 399 en decimal. Por lo tanto:
1296 es congruente con 1 módulo 37 , por lo que esto se puede simplificar como:
Un caso especial es la transición de G # a Ab , ya que esperaríamos Hb para cumplir con las fórmulas anteriores. Sin embargo, este también funciona porque:
fuente
Perl,
3932 bytesIncluye
+1
parap
Dé las notas de inicio y fin como dos líneas en STDIN
Solo el código:
fuente
Japt , 27 bytes
¡Pruébelo en línea! Toma la entrada como una matriz de dos cadenas.
¡También funciona para cualquier cantidad de objetos punzantes o planos en cualquier nota base!
Explicación
fuente
Perl 5 +
-p
, 66 bytesPruébalo en línea!
Toma valores separados por comas. También funciona para Cb, B #, E #, Fb y múltiples # / b.
Explicación:
Explicación para eval:
fuente
Ruby , 56 bytes
Pruébalo en línea!
Las letras se analizan de acuerdo con su código ASCII veces de la
5/3
siguiente manera (esto da el número requerido de semitonos más un desplazamiento de 108)El último carácter (
#
,b
o la letra de nuevo) se analiza como su código ASCII dividido por 32 de la siguiente maneraEsto se resta del código de la letra.
Luego, el resultado final se devuelve como
13-(difference in semitones)%12
fuente
Stax ,
2524 bytesEjecútelo y depúrelo en línea
La representación ascii correspondiente del mismo programa es esta.
Efectivamente, calcula el índice del teclado de cada nota usando una fórmula, luego calcula el intervalo resultante.
2 - code / 32
dondecode
está el código ASCII del último carácter.fuente
["F#","B"]
debería ser 6.Lote,
136135 bytesExplicación: Las sustituciones en la
c
subrutina reemplazan#
en el nombre de la nota con+1
yb
con-1
. Como esto no distingue entre mayúsculas y minúsculas, seBb
vuelve-1-1
. Por lo tanto, las variables paraC
...A
(también entre mayúsculas y minúsculas) se eligen para que sean el número apropiado de semitonos de distanciaB=-1
. Luego se evalúa la cadena resultante, y el truco de @ xnor de restar el resultado del valor da el efecto deseado de restar los valores de las notas entre sí. Editar: Finalmente uso el truco de @ Arnauld de restar el módulo de 13 para lograr la respuesta deseada, ahorrando 1 byte.fuente
Python 3 , 95 bytes
Pruébalo en línea!
-14 bytes gracias a user71546
fuente
ord(q[0])-65
reemplazo"ABCDEFG".find(q[0])
;)(g(b)+~g(a))%12+2
reemplazo1+((g(b)-g(a))%12or 12)
Jalea , 28 bytes
Un enlace monádico que acepta una lista de dos listas de caracteres y devuelve un entero.
Pruébalo en línea! o ver todos los casos posibles .
¿Cómo?
Realiza una aritmética extraña en los ordinales de los caracteres de entrada para asignar las notas a los enteros de cero a doce y luego realiza una descompresión de la base como proxy del módulo por doce, donde cero se reemplaza por 12 y luego agrega uno.
También a 28 bytes ...
Un puerto (no tan directo) de la respuesta Python 2 de xnor ...
Prueba todos los casos posibles
fuente
CJam , 67 bytes
Intérprete en línea: http://cjam.aditsu.net/
fuente