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!
Respostas:
SOGL V0.12 ,
178175174173172171 bytesExperimente aqui! (θ adicionado para facilitar o uso; para executar com 171 bytes, espera que a entrada esteja na pilha)
Tanto quanto eu posso dizer, isso funciona, mas se você encontrar algum problema, diga-me.
Explicação:
primeira parte: criação de telas
segunda parte: loop, posicionamento da cabeça da nota
terceira parte: bandeiras e hastes
fonte
2bs
no seu exemplo deve ter a haste apontando para baixo.JavaScript (ES6),
616527 bytesObrigado @shaggy por remover quase 90 bytes
Eu não tinha idéia sobre anotações ... até agora, espero que eu acertei.
explicação
fonte
t[0]
et[2]
, em seguida, basta fazêq=t.length*9
s>6&&(
qual pode economizar um byte. Você também pode salvar outro byte substituindo(w=q+12)
porw
,repeat(q=i.length*9)
withrepeat(w=i.length*9)
erepeat(q)
withrepeat(w,w+=12)
.Carvão ,
180171168163 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Imprima a pauta.
Imprima a clave.
Passe por cada nota.
Encontre a coordenada Y da nota.
Isso é realmente sorrateiro:
χ
é uma variável predefinida para 10, que é exatamente a coordenada X do acidental da primeira nota, se houver uma. Depois de pular para essa posição, 9 é adicionado a ela, representando a próxima posição da nota.Imprima o acidental, se houver um.
Imprima as linhas do razão, se necessário, e a nota. De fato, a linha é impressa em qualquer coordenada y, embora imprimi-la sobre a pauta não tenha efeito, é claro.
Nada mais a fazer para semibreves.
Para notas abaixo do ponto médio,
puxe a haste para cima,
e a bandeira dos trêmulos.
Para notas acima do ponto médio,
desenhe a haste para baixo,
e a bandeira dos trêmulos.
fonte