Nota : Anders Kaseorg me avisa que isso pode ser uma duplicata de outra pergunta anterior . Parece que sim, e desculpe-me por não ter encontrado essa pergunta antes de postar esta. No entanto, essa pergunta recebeu apenas uma resposta e essa é mais simples, caso você queira tentar dessa vez. No entanto, vou entender se essa pergunta acaba sendo marcada como duplicada.
O desafio
Dada uma entrada como esta:
8g 8Df 4cs 2C 1A
Escreva o programa / função mais curto que produz uma saída como esta:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
Regras
A saída deve consistir em uma pauta de cinco linhas, começando com o desenho de uma clave G exatamente como mostrado acima, alinhada à esquerda da pauta e deixando uma única coluna após o início da pauta.
/\
| |
---|-|--
|/
---/|---
/ |
-|--|---
| (| \
-|--|--)
\ | /
-----|--
|
*_/
^
Single column
As notas devem começar com um *
ou um o
caractere, dependendo do seu tipo.
Deve haver exatamente oito colunas de separação cada *
ou um o
personagem:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
↑ ↑ ↑ ↑ ↑ ↑ ↑
8 columns of separation
A equipe deve terminar com o terminador alinhado à direita, como mostra o exemplo. A barra esquerda do terminador deve ser separada 8 colunas da última nota.
A entrada será uma única sequência contendo as notas (pelo menos uma, sem entradas vazias), cada uma separada por um espaço em branco (você pode considerar que todas as notas serão adequadas, portanto, não é necessário verificar se há erros). Você também pode considerar a entrada como uma matriz de cadeias, com uma nota por elemento na matriz. Para cada nota, o primeiro caractere será o denominador do tamanho da nota ( 1
para uma nota inteira / semibreve , começa com o
; 2
para uma meia nota / mínima , começa com o
; 4
para uma semínima / virilha , começa com *
; e 8
para uma oitava nota / tremor , começa com*
) O segundo caractere será a nota (consulte a tabela a seguir) e o terceiro caractere opcional será f
ou F
para notas simples e / s
ou S
para notas agudas.
--- A (ledger line)
G
-------- F
E
-------- D
C
-------- b
a
-------- g
f
-------- e
d
--- c (ledger line)
Obviamente, a entrada deve respeitar o caso das notas, mas você pode escolher o caso dos modificadores f
e s
.
Faça anotações c
e A
adicione duas -
(linhas de contabilidade), uma de cada lado, pois elas devem estender a equipe. Notas d
e G
estão fora da equipe, mas não precisa de linhas de livro.
As notas achatadas ou afiadas devem adicionar uma b
ou #
duas posições à esquerda da nota.
As hastes (se houver) devem ser desenhadas com 4 barras verticais. As notas de b
cima e de cima devem puxar a haste para baixo e no lado esquerdo da nota. As notas de a
e para baixo devem desenhar a haste para cima e no lado direito da nota. Os quavers devem adicionar a bandeira, sempre à direita e exatamente como mostrado, e não precisam ser transferidos se houver várias delas seguidas.
--------------------------
-----|\----b-*------------
| | |
-----|------|-------------
| | |
----*-------|/---------|--
↑↑ |
----||------↑↑---------|--
|| || |
|| || #-*-
|\ |\ ↑↑
| Stem | Note | Stem
Note Stem Note
Como sempre, seu programa / função pode desenhar diretamente a saída ou retornar uma string, matriz de strings, matriz de caracteres ou qualquer outro formato razoável.
Links Úteis
Isso é código-golfe , portanto, pode ganhar o programa / função mais curto para cada idioma!
Bônus: tente escrever exemplos com melodias famosas e deixe todos tentarem adivinhar qual é a melodia!