Desenhar uma assinatura de chave ASCII


22

Dada a entrada de uma nota, imprima um desenho ASCII da chave principal correspondente na clave de sol.

Aqui estão todas as principais chaves (que não incluem objetos pontiagudos ou planos duplos) e suas assinaturas de chave correspondentes:


Círculo dos quintos de luxo 4 pelo usuário da Wikipedia Simplesmente Bill, direitos autorais CC BY-SA 3.0

Se a entrada for uma chave com objectos cortantes, desenhe a seguinte arte ASCII com o número apropriado de objetos cortantes:

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

---------

E se a entrada for uma chave com apartamentos:

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

Aqui está um resumo conciso das entradas possíveis, bem como quantos perfurocortantes ou planos eles usam:

   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

Todas as cinco linhas de traços devem ser sempre desenhadas, mas pode haver qualquer número de traços por linha, de modo que os perfurocortantes ou planos tenham pelo menos uma coluna de preenchimento de cada lado, desde que cada linha de traços tenha o mesmo comprimento. Por exemplo, estas também são saídas aceitáveis ​​para a entrada Ab:

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

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

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

No caso de Dó maior, que não possui perfurocortantes nem planos, qualquer número positivo de traços por linha (até um) é aceitável.

Qualquer quantidade de espaço em branco à esquerda ou à direita é boa, assim como os espaços à direita em cada linha. Espaços iniciais extras são válidos desde que haja o mesmo número em cada linha.

Você pode receber entradas em minúsculas ou exigir que entradas sem uma nitidez ou apartamento contenham um espaço à direita, se assim o desejar.

Como esse é o , a solução mais curta em bytes será vencedora.



3
@ Neil Ah, desculpe por roubar seu desafio> _ <Eu procurei no site principal antes de postar, mas não pensei em verificar a caixa de areia.
Maçaneta

Respostas:


3

Python 2 , 206 197 178 175 168 161 bytes

Obrigado ao Sr. Xcoder por -12 bytes!

Esta é uma função que retorna o resultado como uma lista 2D de caracteres. Se a entrada não contiver uma afiada / plana, ela deve ser preenchida com um espaço.

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]

Experimente online!


Eu acho que "FCGDAEB".find(k[0])-1mapeia Fpara -1e os outros para o seu índice - 1, então acho n="CGDAEB".find(k[0])+7*('#'in k)-7*('b'in k)que funcionaria. ( 175 bytes? )
Sr. Xcoder

@ Mr.Xcoder Isso é inteligente ... obrigado.
FlipTack

3

Carvão , 60 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Calcule o número de objectos cortantes na assinatura da chave.

←UO⁹¦⁹-¶

Imprima a pauta, mas um quadrado à esquerda da origem para que o primeiro ponto nítido / plano esteja na coluna zero.

Fθ«

Faça um loop sobre quaisquer objetos cortantes.

Jι⊖﹪⊕׳ι⁷#»

Calcule a linha da nítida e imprima-a.

F±θ«

Laço sobre qualquer apartamento.

Jι⊕﹪⁺³×⁴ι⁷b

Calcule a linha do apartamento e imprima-a.


2

Anterior, 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

Experimente online!

Observe que a entrada deve terminar com um avanço de linha, como normalmente ocorreria ao executar o programa interativamente.

Explicação

Começamos lendo dois caracteres de stdin - a nota principal, n , e um acidental, a (que pode ser um avanço de linha se não houver acidental). Usando esses valores, calculamos o número da assinatura da chave, signum , da seguinte maneira:

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

Isso retorna um valor no intervalo de -7 a 7, onde o sinal nos diz se precisamos de objetos cortantes ou planos (positivos ou negativos), e o valor absoluto nos fornece o número de objetos cortantes ou planos necessários. Assim, para uso posterior, extraímos o sinal, s , ea acidental contagem, cnt , com:

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

Em seguida, temos dois loops aninhados, iterando um número de linha, r , de 9 a 0, e um número de coluna, c , de 0 a 8. Para uma linha e coluna específica, calculamos se um acidente deve ser visível nesse ponto. apontar com:

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

Se não for acidental, precisamos gerar uma linha ou espaço, dependendo de a linha, r , ser ímpar ou par. E se for acidental, precisamos gerar uma imagem nítida ou plana, dependendo do sinal s . Portanto, avaliamos a seguinte fórmula:

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

O que nos dá um índice no intervalo de 0 a 3, representando uma linha, um espaço, um plano ou um ponto. Simplesmente usamos esse índice para procurar o caractere de saída necessário em uma tabela, que você pode ver incorporado no início da segunda linha de código.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.