Dada una partitura musical ASCII, debe poder emitir la nota y su longitud correspondiente. El puntaje contendrá entre 5 y 15 notas inclusive, y se transcribe en un pentagrama. Un pentagrama se compone de cinco líneas horizontales que comprenden - (menos) caracteres separados por líneas de espacios. La línea de fondo en el pentagrama es equivalente a la nota 'E'. La línea de espacios inmediatamente arriba de la línea inferior indica una 'F', y es de un tono más alto que la 'E' debajo de ella. Esto continúa como a continuación. Tenga en cuenta que las notas solo suben a 'G' antes de comenzar nuevamente en 'A'. Vea abajo:
F ----------
E
D ----------
C
B ----------
A
G ----------
F
E ----------
Tenga en cuenta que las letras no están incluidas en la entrada. Las notas se superponen en la parte superior del pentagrama utilizando un carácter ao (minúscula ooh) para indicar la "cabeza de la nota". Este encabezado de nota indica la frecuencia de la nota y, por lo tanto, la representación alfabética de la misma como se indicó anteriormente. Por ejemplo, una nota colocada en el puntaje como se indica a continuación indica una 'A':
----
----
----
o
----
----
Una nota, como la 'A' anterior, se llama 'nota completa' y se tocaría durante un tiempo completo. Se pueden indicar otras duraciones al incluir un 'vástago' que se eleva desde la nota y entre cero y tres 'banderas'. Un tallo se compone de tres | (tubería o barra vertical) caracteres apilados inmediatamente encima del encabezado de la nota. Un tallo sin banderas se considera un 'cuarto de nota', y juega durante un cuarto de segundo. Las banderas son caracteres \ (barra invertida) y se encuentran en el lado derecho del tallo. Cada vástago reduce a la mitad el tiempo de reproducción de la nota. La duración de cada nota será una de las siguientes: una nota completa, un cuarto de nota, una octava nota, una semicorchea o una nota de treinta segundos. Así se vería cada tipo de nota para A:
--------------------
----|---|\--|\--|\--
| | |\ |\
----|---|---|---|\--
o o o o o
--------------------
--------------------
Poner más de una nota juntos te da una puntuación. Se puede considerar que cada nota tiene cuatro caracteres de ancho, con una nota en la primera columna de cada bloque de cuatro caracteres. Por ejemplo :
|\
----|\--|\----------
|\ | |\
----o---|---o---|\--
| o |
|---------------o---
|
o-------------------
--------------------
El ejemplo anterior contiene las siguientes notas, en orden: un cuarto de nota 'G', una nota de treinta segundos 'D', una octava nota 'C', una nota completa 'D' y una decimosexta nota 'B'. Cada nota en su salida debe estar en el formato letra / longitud, donde la letra es AG y la longitud es la fracción de la longitud de la nota en comparación con una nota completa. Como excepción, la longitud y / carácter no deben imprimirse si la nota es una nota completa. Cada nota en su salida debe estar separada por un solo espacio. Por lo tanto, para el puntaje anterior, su código debería generar lo siguiente:
G/4 D/32 C/8 D B/16
- Las notas estarán en el siguiente rango: EFGABCDE F. Tenga en cuenta que solo se necesita imprimir la letra, se ignora la octava.
- Tenga en cuenta que el número de líneas de entrada varía de 9 a 12, ya que las notas con un cuarto de hora o menos en la línea D o superior requerirán que se muestren más líneas por completo.
- No hay media nota en este caso.
El código más corto gana (el espacio en blanco no cuenta).
Editar: corrigió el error en el espaciado en una entrada.
Algunas entradas de muestra:
|\
----|\--|-------------------
|\ | |
|---|---o---------------o---
| o |\
o---------------|\--|\------
|\ |\ |\
------------|\--|\--o-------
|\ o
------------o---------------
Salida: B / 8 C / 8 D / 8 E / 32 F / 32 G / 32 D
----------------o-------------------
o
------------o-----------------------
o
--------o---------------------------
o
----o-------------------------------
o
o-----------------------------------
Salida: EGBDFFACE
|\
|\
|\
------------o-------|-----------
| o | |\
|---|\--------------|---|\------
| | o |\
o---|---|\--------------o---|\--
o |\ |\
--------|\------------------|---
o o
--------------------------------
Salida: B / 4 A / 8 F / 32 F / 32 EC / 4 B / 32 F / 16
Respuestas:
Javascript,
284,279,278,225,221, 220 caracteres (incluido el espacio en blanco necesario)One-liner ( violín de prueba ):
Legible ( violín de prueba ):
fuente
;
y hacer algunos trucos, puede hacerlo aún más corto.function a(c){b='',d=c.split('\n');for(e=0;d[0][e++];){for(i=f=0;g=d[i++];){h=g[e-1];if(h=='o')b+=(b?' ':'')+String.fromCharCode((d.length+4-i)%7+65);if(h=='|')f=f||4;f*=1+(g[e]=='\\');}if(f)b+='/'+f}return b}
(209 caracteres)Perl, 103 caracteres
(108 si cuenta los espacios en blanco necesarios)
Con espacios en blanco para la presentación:
Tenga en cuenta que supongo que todas las líneas tienen la misma longitud (según la versión revisada de la pregunta).
Versión reorganizada con explicaciones:
(solución antigua y más larga, conservada porque puede ser interesante incluso si es un poco más larga)
Perl,
147126 caracteres(
149131 si cuenta los espacios en blanco necesarios)Con espacios en blanco para la presentación:
Reorganizado un poco para no abusar tanto del idioma:
Tenga en cuenta que supongo que todas las líneas tienen la misma longitud. Si desea permitir líneas más cortas, una solución obvia es agregar
$_.=1x$c,
al comienzo del programa, a un costo de 9 caracteres.Pensé en otro enfoque para evitar palabras largas como
split
ymap
y dejar que los espacios hicieran más trabajo, pero la repetitiva y la puntuación se vengaron, y solo puedo reducirlo a 130 (144 con el espacio en blanco necesario).El parche para hacer frente a las líneas sin terminar es un poco más extraño esta vez (¿qué, pensaste que no podría ser más extraño?). 139 caracteres, 155 con espacios en blanco necesarios.
fuente
Scala (2.9),
352313291294290277274273 caracteresSi una función es todo lo que se necesita:
Si se requiere un programa completo:
fuente
J - 108 caracteres
Sin golf:
fuente
Python golf, 207 caracteres.
He inicio de códigos de golf con Python durante 2 días y me encontré con que cosas como
import sys
,sys.stdin.read
,sys.stdout.write
son expansivas.fuente