Nota : Anders Kaseorg me advierte que esto podría ser un duplicado de otra pregunta anterior . Parece que sí, y lo siento, no encontré esa pregunta antes de publicar esta. Sin embargo, esa pregunta solo recibió una respuesta y esta es más simple, en caso de que todos quieran intentarlo esta vez. Sin embargo, entenderé si esta pregunta termina siendo marcada como duplicada.
El reto
Dada una entrada como esta:
8g 8Df 4cs 2C 1A
Escriba el programa / función más corto que produce una salida como esta:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
Reglas
El resultado debe consistir en un pentagrama de cinco líneas que comience con el dibujo de una clave de sol exactamente como se muestra arriba, alineado a la izquierda del pentagrama y dejando una sola columna después del inicio del pentagrama.
/\
| |
---|-|--
|/
---/|---
/ |
-|--|---
| (| \
-|--|--)
\ | /
-----|--
|
*_/
^
Single column
Las notas deben comenzar con un *
o un o
carácter dependiendo de su tipo.
Debe haber exactamente ocho columnas de separación cada uno *
o un o
personaje:
/\ -o-
| |
---|-|---------------------------------------------------|-|
|/ | |
---/|--------|\----b-*-----------------------------------|-|
/ | | | | o | |
-|--|--------|------|-----------------|------------------|-|
| (| \ | | | | | |
-|--|--)----*-------|/---------|------|------------------|-|
\ | / | | | |
-----|-------------------------|-------------------------|-|
| |
*_/ #-*-
↑ ↑ ↑ ↑ ↑ ↑ ↑
8 columns of separation
El personal debe terminar con el terminador alineado a la derecha como se muestra en el ejemplo. La barra izquierda del terminador debe estar separada 8 columnas de la última nota.
La entrada será una sola cadena que contiene las notas (al menos una, sin entradas vacías), cada una separada por un espacio en blanco (puede considerar que cada nota será la adecuada, por lo que no es necesario verificar si hay errores). También puede tomar la entrada como una matriz de cadenas, con una nota por elemento en la matriz. Para cada nota, el primer carácter será el denominador de la duración de la nota ( 1
para una nota entera / semibreve , comienza con o
; 2
para una media nota / mínima , comienza con o
; 4
para un cuarto de nota / entrepierna , comienza con *
; y 8
para un octavo nota / temblor , comienza con*
) El segundo carácter será la nota (ver tabla siguiente), y el tercer carácter opcional será f
o F
para notas planas y / s
o S
para notas agudas.
--- A (ledger line)
G
-------- F
E
-------- D
C
-------- b
a
-------- g
f
-------- e
d
--- c (ledger line)
Obviamente, la entrada debe respetar el caso de las notas, pero puede elegir el caso de la f
y s
modificadores.
Notas c
y A
debe agregar dos -
(líneas contables), una a cada lado, ya que deben extender el pentagrama. Notas d
y G
están fuera del personal, pero no necesitan líneas contables.
Las notas planas o afiladas deben agregar b
o #
dos posiciones a la izquierda de la nota.
Los tallos (si los hay) deben dibujarse con 4 barras verticales. Las notas de b
arriba deben dibujar el tallo hacia abajo y al lado izquierdo de la nota. Las notas desde a
y hacia abajo deben dibujar el tallo hacia arriba y en el lado derecho de la nota. Los quavers deben agregar la bandera, siempre hacia la derecha y exactamente como se muestra, y no necesitan ser emitidos si hay varios de ellos en una fila.
--------------------------
-----|\----b-*------------
| | |
-----|------|-------------
| | |
----*-------|/---------|--
↑↑ |
----||------↑↑---------|--
|| || |
|| || #-*-
|\ |\ ↑↑
| Stem | Note | Stem
Note Stem Note
Como de costumbre, su programa / función puede dibujar directamente la salida o devolver una cadena, una matriz de cadenas, una matriz de caracteres o cualquier otro formato razonable.
Enlaces útiles
Este es el código de golf , ¡así que puede ganar el programa / función más corto para cada idioma!
Bonificación: ¡intenta escribir ejemplos con melodías famosas y deja que todos intenten adivinar qué melodía es!
Respuestas:
SOGL V0.12 ,
178175174173172171 bytesPruébalo aquí! (θ agregado para facilitar su uso; para ejecutarse como 171 bytes, espera que la entrada esté en la pila)
Por lo que puedo decir, esto funciona, pero si encuentras algún problema, dímelo.
Explicación:
primera parte: creación del lienzo
segunda parte: bucle, colocación de cabeza de nota
tercera parte: banderas y tallos
fuente
2bs
en su ejemplo debe tener el tallo apuntando hacia abajo.JavaScript (ES6),
616527 bytesGracias @shaggy por eliminar casi 90 bytes
No tenía idea de las notas ... hasta ahora, espero haberlo hecho bien.
explicación
fuente
t[0]
yt[2]
, a continuación, sólo lo hacenq=t.length*9
s>6&&(
cual puede ahorrarle un byte. También puede guardar otro byte reemplazando(w=q+12)
conw
,repeat(q=i.length*9)
conrepeat(w=i.length*9)
yrepeat(q)
conrepeat(w,w+=12)
.De carbón ,
180171168163 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Imprime el bastón.
Imprime la clave.
Recorre cada nota.
Encuentra la coordenada Y de la nota.
Esto es realmente astuto:
χ
es una variable que está predefinida a 10, que es exactamente la coordenada X de la primera nota accidental, si tiene una. Después de saltar a esa posición, se agrega 9, que representa la siguiente posición de nota.Imprima el accidental, si hay uno.
Imprima las líneas del libro mayor si es necesario y la nota. De hecho, la línea se imprime en cualquier coordenada y uniforme, aunque imprimirla sobre el pentagrama no tiene ningún efecto, por supuesto.
Nada más que hacer para semibreves.
Para notas debajo del punto medio,
dibuja el tallo hacia arriba,
y la bandera de los temblores.
Para notas por encima del punto medio,
dibuja el tallo hacia abajo,
y la bandera de los temblores.
fuente