Dibuja una firma de clave ASCII

22

Dada la entrada de una nota, genera un dibujo ASCII de la clave principal correspondiente en la clave de sol.

Estas son todas las claves principales (que no incluyen objetos punzantes dobles o planos dobles) y sus firmas de teclas correspondientes:


Círculo de quintas deluxe 4 por usuario de Wikipedia Just simple Bill, copyright CC BY-SA 3.0

Si la entrada es una clave con objetos punzantes, dibuje el siguiente dibujo ASCII con el número apropiado de objetos punzantes:

   #
-#-------
      #
----#----
  #
-------#-
     #
---------

---------

Y si la entrada es una clave con pisos:

---------
  b
----b----
      b
-b-------
   b
-----b---
       b
---------

Aquí hay un resumen conciso de las posibles entradas, así como la cantidad de objetos punzantes o planos que utilizan:

   0   1   2   3   4   5   6   7
#  C   G   D   A   E   B   F#  C#
b  C   F   Bb  Eb  Ab  Db  Gb  Cb

Las cinco líneas de guiones siempre deben dibujarse, pero puede haber cualquier cantidad de guiones por línea, de modo que los objetos punzantes o planos tengan al menos una columna de relleno en cada lado, siempre que cada línea de guiones tenga la misma longitud. Por ejemplo, todos estos son también resultados aceptables para la entrada Ab:

---------   ------   ---------   ----------------
  b           b           b          b
----b----   ----b-   -------b-   ------b---------

-b-------   -b----   ----b----   ---b------------
   b           b           b          b
---------   ------   ---------   ----------------

---------   ------   ---------   ----------------

En el caso de Do mayor, que no tiene objetos punzantes ni planos, cualquier número positivo de guiones por línea (incluso uno) es aceptable.

Cualquier cantidad de espacios en blanco iniciales o finales está bien, al igual que los espacios finales en cada línea. Los espacios iniciales adicionales están bien siempre que haya el mismo número en cada línea.

Si lo desea, puede tomar la entrada en minúsculas o requerir que las entradas sin una nitidez o un plano contengan un espacio final.

Como se trata de , la solución más corta en bytes ganará.

Pomo de la puerta
fuente
3
@Neil Ah, perdón por robarte el desafío> _ <Busqué en el sitio principal antes de publicar pero no pensé en revisar el sandbox.
Pomo de la puerta

Respuestas:

3

Python 2 , 206 197 178 175 168 161 bytes

¡Gracias al Sr. Xcoder por -12 bytes!

Esta es una función que devuelve el resultado como una lista 2D de caracteres. Si la entrada no contiene un filo agudo / plano, debe rellenarse con un espacio.

def f(k,r=range(10)):n="CGDAEB".find(k[0])+7*' #'.find(k[1]);return[[(' -'[i%2],'b#'[n>0])[0<j<=abs(n)and`i`==(n*"1403625"+"5263748")[j-1]]for j in r]for i in r]

Pruébalo en línea!

FlipTack
fuente
Creo "FCGDAEB".find(k[0])-1mapas Fa -1y los otros a su índice - 1, por lo que creo n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)que funcionaría en su lugar. ( 175 bytes? )
Sr. Xcoder
@ Mr.Xcoder Eso es inteligente ... gracias.
FlipTack
3

Carbón , 60 bytes

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ←UO⁹¦⁹-¶Fθ«Jι⊖﹪⊕׳ι⁷#»F±θ«Jι⊕﹪⁺³×⁴ι⁷b

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

≔⁻⁺⊖﹪⊗℅§θ¬χ⁷×⁷№θ#×⁷№θbθ

Calcule el número de objetos punzantes en la firma clave.

←UO⁹¦⁹-¶

Imprima el pentagrama, pero queda un cuadrado a la izquierda del origen para que el primer filo / plano esté en la columna cero.

Fθ«

Pase sobre cualquier objeto punzante.

Jι⊖﹪⊕׳ι⁷#»

Calcule la fila de la nitidez e imprímala.

F±θ«

Pase sobre cualquier piso.

Jι⊕﹪⁺³×⁴ι⁷b

Calcule la fila del piso e imprímalo.

Neil
fuente
2

Befunge, 139 bytes

~9%:4%7*+4/7%~6%1-2/7*+vv\`0:\!-g02+*2g00+1%7+g00*+3g00::<<0+55p02:_@
- b#09p01*-1*2p00:`0:-8<>10g`!**:00g2+*\!20g2%*+1g,1+:8`!#^_>$,:1-\^1

Pruébalo en línea!

Tenga en cuenta que se espera que la entrada finalice con un salto de línea, como ocurriría normalmente al ejecutar el programa de forma interactiva.

Explicación

Comenzamos leyendo dos caracteres de stdin: la nota principal, n , y una accidental, a (que puede ser un salto de línea si no hay ninguna accidental). Usando esos valores, calculamos el número de firma clave, signum , de la siguiente manera:

signum = (n%9 + n%9%4*7)/4%7 + (a%6 - 1)/2*7 - 8

Esto devuelve un valor en el rango de -7 a 7, donde el signo nos dice si necesitamos objetos punzantes o planos (positivo o negativo), y el valor absoluto nos da la cantidad de objetos punzantes o planos requeridos. Entonces, para su uso posterior, extraemos el signo, sy el recuento accidental, cnt , con:

s   = (signum > 0)
cnt = abs(signum) 

Luego tenemos dos bucles anidados, iterando un número de fila, r , de 9 a 0 y un número de columna, c , de 0 a 8. Para una fila y columna en particular, calculamos si un accidente debería ser visible en ese momento señalar con:

accidental = (r == (c*(s+3) + s)%7 + 1 + s*2) and (c > 0) and (c <= cnt)

Si no es accidental, necesitamos generar una línea o espacio dependiendo de si la fila, r , es impar o par. Y si se trata de un accidente, debemos emitir un filo agudo o plano según el signo, s . Entonces evaluamos la siguiente fórmula:

index = (!accidental * (r%2)) + (accidental * (s+2))

Lo que nos da un índice en el rango de 0 a 3, que representa una línea, un espacio, un plano o un filo. Simplemente usamos ese índice para buscar el carácter de salida requerido de una tabla, que puede ver incrustado al comienzo de la segunda línea de código.

James Holderness
fuente