Dessinez une signature de clé ASCII


22

Étant donné l'entrée d'une note, sortez un dessin ASCII de la clé principale correspondante sur la clé de sol.

Voici toutes les clés principales (qui n'incluent pas les doubles objets tranchants ou doubles) et leurs signatures de clés correspondantes:


Cercle des quintes deluxe 4 par l'utilisateur de Wikipédia Just plain Bill, copyright CC BY-SA 3.0

Si l'entrée est une clé avec des objets tranchants, dessinez l'illustration ASCII suivante avec le nombre approprié d'objets tranchants:

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

---------

Et si l'entrée est une clé à plat:

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

Voici un résumé concis des entrées possibles ainsi que du nombre d'objets tranchants ou plats qu'ils utilisent:

   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

Les cinq lignes de tirets doivent toujours être tracées, mais il peut y avoir un nombre quelconque de tirets par ligne de sorte que les objets tranchants ou plats aient au moins une colonne de rembourrage de chaque côté, tant que chaque ligne de tirets a la même longueur. Par exemple, ce sont également des sorties acceptables pour l'entrée Ab:

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

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

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

Dans le cas du do majeur, qui n'a ni objets tranchants ni plats, tout nombre positif de tirets par ligne (même un) est acceptable.

Tout espace blanc de début ou de fin est correct, tout comme les espaces de fin sur chaque ligne. Les espaces de tête supplémentaires sont acceptables tant qu'il y a le même numéro sur chaque ligne.

Vous pouvez prendre des entrées en minuscules ou exiger que les entrées sans tranchant ou plat contiennent un espace de fin, si vous le souhaitez.

Puisqu'il s'agit de , la solution la plus courte en octets gagnera.



3
@Neil Ah, désolé d'avoir volé votre défi> _ <J'ai cherché sur le site principal avant de poster mais je n'ai pas pensé à vérifier le bac à sable.
Poignée de porte

Réponses:


3

Python 2 , 206 197 178 178 168 168 161 octets

Merci à M. Xcoder pour -12 octets!

Il s'agit d'une fonction qui renvoie le résultat sous forme de liste 2D de caractères. Si l'entrée ne contient pas de pointu / plat, elle doit être complétée d'un espace.

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]

Essayez-le en ligne!


Je pense que les "FCGDAEB".find(k[0])-1cartes Fà -1et les autres à leur index - 1, donc je pense que n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)cela fonctionnerait à la place. ( 175 octets? )
M. Xcoder

@ Mr.Xcoder C'est intelligent ... merci.
FlipTack

3

Charbon de bois , 60 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Calculez le nombre d'objets tranchants dans la signature de clé.

←UO⁹¦⁹-¶

Imprimez la portée, mais un carré à gauche de l'origine afin que le premier pointu / plat soit dans la colonne zéro.

Fθ«

Faites une boucle sur les objets tranchants.

Jι⊖﹪⊕׳ι⁷#»

Calculez la ligne du tranchant et imprimez-le.

F±θ«

Faites une boucle sur tous les appartements.

Jι⊕﹪⁺³×⁴ι⁷b

Calculez la rangée de l'appartement et imprimez-la.


2

Befunge, 139 octets

~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

Essayez-le en ligne!

Notez que l'entrée doit se terminer par un saut de ligne, comme cela se produit généralement lors de l'exécution interactive du programme.

Explication

Nous commençons par lire deux caractères de stdin - la note principale, n , et un accidentel, a (qui peut être un saut de ligne s'il n'y a pas d'accident). En utilisant ces valeurs, nous calculons le numéro de signature de clé, signum , comme suit:

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

Cela renvoie une valeur comprise entre -7 et 7, où le signe nous indique si nous avons besoin d'objets tranchants ou plats (positifs ou négatifs), et la valeur absolue nous donne le nombre d'objets tranchants ou plats requis. Donc, pour une utilisation ultérieure, nous extrayons le signe, s , et le nombre accidentel, cnt , avec:

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

Ensuite, nous avons deux boucles imbriquées, itérant un numéro de ligne, r , de 9 à 0, et un numéro de colonne, c , de 0 à 8. Pour une ligne et une colonne particulières, nous calculons si un accidentel doit être visible à ce pointer avec:

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

Si ce n'est pas un accident, nous devons afficher une ligne ou un espace selon que la ligne, r , est impaire ou paire. Et s'il s'agit d'un accident, nous devons produire une image nette ou plate selon le signe, art . Nous évaluons donc la formule suivante:

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

Ce qui nous donne un indice compris entre 0 et 3, représentant soit une ligne, un espace, un plat ou un pointu. Nous utilisons simplement cet index pour rechercher le caractère de sortie requis dans une table, que vous pouvez voir intégré au début de la deuxième ligne de code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.