Antes de partir, no tiene que entender mucha notación musical para hacer este desafío.
EXPLICACIÓN
En la partitura estándar, las claves dobles atraviesan la página y sirven como puntos de referencia para las notas, lo que le permite saber qué nota debe reproducirse. Si aún no está familiarizado con la clave de agudos y bajos, aquí hay una descripción de Wikipedia:
Una clave es un símbolo musical utilizado para indicar el tono de las notas escritas. Colocado en una de las líneas al comienzo del pentagrama, indica el nombre y el tono de las notas en esa línea. Esta línea sirve como un punto de referencia por el cual se pueden determinar los nombres de las notas en cualquier otra línea o espacio del pentagrama.
En la imagen de arriba, la mitad superior de las líneas es la clave de sol, denotada con un
La mitad inferior es la clave de bajo, denotada con un
Como se puede ver en la clave de sol una nota en la parte inferior-line más es una E . (No estoy contando notas fuera de las líneas agudo por este desafío) En la clave de fa, la línea más baja es un G . Para completar este desafío, debe hacer lo siguiente:
DESAFÍO
Dada una entrada en una de las siguientes formas (su elección), conviértala a la clave opuesta. Si se trata de la clave de sol o de graves, puede ser un valor de Truthey / Falsey en su idioma (no solo dos valores), p. Ej.
F # T o F # Verdadero o F # Agudos
pero no
F # -1 o F # 4
Los espacios y las mayúsculas son opcionales, los planos no aparecerán y no se permiten espacios en blanco al final.
Input Expected Output
E Treble G
F Treble A
F# Treble A#
G Treble B
G# Treble C
A Treble C
A# Treble C#
B Treble D
C Treble E
C# Treble F
D Treble F
D# Treble F#
E Treble G
F Treble A
F# Treble A#
G Bass E
G# Bass F
A Bass F
A# Bass F#
B Bass G
C Bass A
C# Bass A#
D Bass B
D# Bass C
E Bass C
F Bass D
F# Bass D#
G Bass E
G# Bass F
A Bass F
A# Bass F#
Tenga cuidado, este no es un desafío trivial de diferencia constante. Mire de cerca las entradas y salidas. Si miras un piano,
las teclas negras son punzantes, denotadas por #. Tenga en cuenta que no hay un E # o un B #. Esto significa que si recibe G # en la clave de graves, en lugar de devolver E # , debe devolver F
Este es el código de golf , por lo que gana el número más pequeño de bytes.
fuente
C
lugar deC
) está bien?1
y-1
(o incluso decir,4
y-4
) para la entrada del indicador de clave o esto solo sería aceptable si son valores de verdad / falsey en nuestro idioma?Respuestas:
Jalea ,
3534 bytesTengo la sensación de que algo de aritmética puede ganar sobre este método.
Pruébalo en línea!
Un programa completo que toma 1) el indicador de clave
0
o1
para graves o agudos respectivamente y 2) la nota; e imprimir la nota resultante.Sería 31 bytes si
-4
y4
fuera aceptable como los valores de entrada del indicador de clave (entoncesÑi+_⁸?4ị¢
pueden convertirseÑi+⁸ị¢
), pero esto se ha aclarado como no permitido a menos que -4 sea falso y 4 sea verdadero, que no es el caso para Jelly.¿Cómo?
Construye un teclado con fantasma
B#
yE#
teclas, encuentra el índice de la entrada, compensa que,4
en la dirección requerida, indexa nuevamente en un teclado con esas teclas fantasmas reemplazadas por sus resultados requeridos (la tecla encima de ellas):fuente
Befunge,
7064 bytesPruébalo en línea!
La entrada debe estar en forma
C# Treble
oF Bass
, aunque la clave puede ser simplemente la primera letra (es decir,T
oB
), ya que el resto de la entrada se ignora de todos modos.Explicación
Como resultado de esta modificación del código, la siguiente secuencia de instrucciones tomará una de dos formas:
En este punto, la pila contiene
note,0,sharp,space
onote,0,space
.En este punto, la pila contiene
note,0
o simplementenote
(con un cero implícito a continuación).fuente
Perl 5, 56 bytes
Lee la nota y la clave como dos líneas de STDIN e imprime la nueva nota en STDOUT. La clave es
0
para agudos y1
bajos.fuente
-p
indicador tio.run/##K0gtyjH9/79YX08/OaNIwcxUW0PXRMvGTju/KEVFTVPVXD/…JavaScript (ES6) 74 bytes
Toma de entrada en la sintaxis Zurra de
(note)(clef)
dondeclef
es0
para el bajo y1
para agudos .Manifestación
Mostrar fragmento de código
¿Cómo?
En realidad, esto es un poco menos divertido que mi versión anterior, pero la tabla de búsqueda subyacente ahora
F#,C#,(unused),D#,A#,F,C,G,D,A,E,B,F
permite acortar la condición # mientras se evita el truco de caracteres NUL , que suponía que era un poco marginal.Versión anterior
7675 bytesManifestación
Mostrar fragmento de código
¿Cómo?
La entrada (n, c) se procesa mediante los siguientes pasos:
Primero evaluamos
4 * !!n[1] + c + n
dónde!!n[1]
es verdadero (forzado a 1 ) si la nota contiene un # , y falso (forzado a 0 ) de lo contrario. La expresión4 * !!n[1] + c
da como resultado un valor numérico que se agrega delante de la cadena n .Paso implícito: los ceros iniciales y los # finales son ignorados por
parseInt()
. Por ejemplo, en"5G#"
realidad se analiza como"5G"
.Convertimos la nueva cadena a un valor decimal analizándola como una cantidad de base 21.
Aplicamos el módulo 24.
Aplicamos el módulo 17.
A continuación se muestra la tabla de resumen para todos los pares de entrada posibles, junto con la salida esperada. Tenga en cuenta que se debe agregar un # a la salida si el resultado final es 0 , 2 , 3 o 5 . De ahí el uso de la máscara binaria 101101 ( 45 en decimal).
fuente
Python 2 , 77 bytes
Función que imprime a
STDOUT
.True
convierte los graves a agudos y losFalse
agudos a graves.Pruébalo en línea!
Explicación:
N=ord(n[0])-63-4*c;
calcula el índice (0 a 7) de la carta de la nueva nota, sin tener en cuenta los objetos punzantes.ord(N[0])-63-4*c
obtiene el índice de la letra actual y suma o resta 2 dependiendo del valor dec
(variable para alternar la dirección de conversión)M=-~N%3<1<len(n);
calcula si esta variable tendrá que ajustarse o no. Por ejemplo, si la nueva nota esE
y la nota original tenía una nitidez, será necesario ajustarla aF
. La desigualdad encadenada funciona de la siguiente manera:-~N%3<1
comprueba si el índice de la nueva nota está en la secuencia3n-1
. Esto solo dará verdadero paraE
yB
, las dos notas que no tienen un fuerte.1<len(n)
comprueba si la nota original tenía una nitidez (esto haría que la longitud de la cuerda fuera mayor que 1). Esto es necesario ya que, si no hubo nitidez, no hay necesidad de ajustar las nuevas letras de nota.M
cualquieraTrue
oFalse
, que se puede usar en el cálculo como1
y0
respectivamente, por lo que para realizar el ajuste solo necesitamos agregar M a N y módulo por 7.chr((N+M)%7+65)
agrega el ajuste si es necesario, luego convierte el valor de un índice a un carácter.+n[1:2-M]
agregará un símbolo agudo si tantoM=0
(no se realizó ningún ajuste) como el valor original también tenían un fuerte.fuente
Java 8, 119 bytes
Explicación:
Pruébalo aquí.
fuente
n->b->((char)((n.charAt(0)-(b?0:4))%7+65)+n.substring(1)).replaceAll("B#","C").replaceAll("E#","F")
R , 111 bytes
Pruébalo en línea!
Sin golf:
fuente