El apocalipsis zombie ha llegado y el mundo está llegando a su fin. De repente, alguien descubre una fórmula que toma la hora, los minutos y el día actuales, y escupe la nota perfecta para tocar en un piano que mata instantáneamente a cada zombi que lo escucha. Desafortunadamente, solo queda un pianista en el mundo, y se ha olvidado de cómo leer notas, pero aún sabe leer partituras. Por supuesto, esto es algo muy sensible al tiempo, por lo que parece natural que una computadora lo haga. 1
Su desafío es tomar una nota, como Gy enviar la nota colocada en un pentagrama (en clave de sol), de esta manera:
-----
-----
|
---|-
|
--O--
-----
Especificación:
- Debe generar un pentagrama de líneas alternas de
-----(5 guiones) y una línea en blanco. Habrá 5-----s en total. La nota debe superponerse sobre este personal. - La entrada especificará dónde se encuentra la nota. La entrada será:
- un opcional
HoL, especificando "alto" o "bajo" - una carta de
AaG, especificando el tono - un opcional
#ob, especificando agudo o plano.
- un opcional
- La "nota" se define como:
- Uno
O(O mayúscula) alineado al centro del pentagrama, que está en el lugar de la nota. (La línea superior esHF(F alta) y la línea inferior esE(una E normal). - Tres
|s (barras verticales), el tallo, que será:- un espacio a la izquierda de la nota y hacia abajo (comenzando un espacio debajo de la nota) si la nota está en la línea media (
B) o arriba, o - un espacio a la derecha de la nota y hacia arriba (comenzando un espacio por encima de la nota) si la nota está debajo de la línea media.
- un espacio a la izquierda de la nota y hacia abajo (comenzando un espacio debajo de la nota) si la nota está en la línea media (
- Un
#obun espacio directamente a la izquierda de la nota si se especifica en la entrada.
- Uno
- Deben agregarse líneas contables si la nota es demasiado alta o baja. Estas líneas serán
---(solo 3 guiones de ancho, en lugar de 5) y solo aparecerán si la nota está en o arriba / abajo (para las líneas de contabilidad superior / inferior respectivamente) las líneas de contabilidad. - Se pueden colocar espacios extraños en cualquier lugar que desee; por ejemplo, podría hacer que las líneas en blanco tengan espacios o después de las líneas del libro mayor si le ayuda a guardar los caracteres.
Aquí hay una visualización, para comprender la especificación más fácilmente, con todos los nombres de las notas al lado de las líneas:
HB
--- HA
HG
----- HF
HE
----- HD
HC
----- B
A
----- G
F
----- E
D
--- C
LB
--- LA
LG
--- LF
... (bottom cut off for brevity, you get the idea anyway)
Aquí hay algunos ejemplos más que puede usar para probar su programa:
Entrada: HG#
#O
-|---
|
-|---
-----
-----
-----
Entrada: LAb
-----
-----
-----
-----
-----
|
--|
|
bO-
Entrada: HB
O
|--
|
-|---
-----
-----
-----
-----
Entrada: C
-----
-----
-----
-----
|
---|-
|
-O-
Este es el código de golf , por lo que el código más corto en bytes ganará.
1: exposición más realista evar! :-PAG

#oba la derecha de la nota en lugar de a la izquierda; ¿Es realmente lo que se requiere?Respuestas:
Golfscript,
211210209197195192 caracteresAl ganar (a partir de esta publicación), una versión de GolfScript de mi última versión de Python :
Pruébelo aquí (las primeras 2 líneas son introducidas por el usuario, normalmente proviene de stdin).
Versión 'legible':
fuente
Ruby -
271267252249234229220214 caracteresLiteralmente aprendí a Ruby para esto. Por lo tanto, ciertamente hay margen de mejora en jugar golf. O haciendo algo realmente. Pero necesitaba un lenguaje con cadenas mutables. :)
Algo descabellado:
Puedo reducirlo en otros 2 caracteres a 212 caracteres si se permiten líneas en blanco iniciales. Esta solución no llena las líneas que no se imprimen de todos modos:
¿Son el juego justo de lambda? Entonces puedo obtener 210 caracteres con el primer enfoque
O 207 caracteres con líneas en blanco adicionales:
Por supuesto, ahora deberías hacerlo
f.call("HGb").fuente
!x.nil?es equivalente a!x. Y para una línea ifs,if x;y;end;es equivalente ay if x. También puede usar una nueva línea literal en esa cadena.ifque trabajar. Si uso?\n(si eso es lo que quisiste decir) necesito agregar un espacio, así no gano nada. Y eliminar los.nil?s no funcionó en absoluto (siempre evaluadotrue)..nil?, pero vale la pena en caracteres.!x.nil?es!!x. :)Python,
329309295286280277 caracteresGolfé un poco más ahora. Todavía se puede mejorar, pero no estoy seguro si puedo vencer a las soluciones ruby o golfscript con este enfoque.
Inicialmente estaba imprimiendo línea por línea, pero resultó que tomaba demasiado, así que generé una cuadrícula de cadena y luego rellené lo que se debe completar. La entrada es desde la línea de comandos, por ejemplo:
fuente
GolfScript -
243232228227 caracteresTraduje mi respuesta CoffeeScript a GolfScript, que es mucho más adecuado para las manipulaciones de cadenas.
EDITAR: guardé seis caracteres usando correctamente el operador de incremento, tres haciendo un buen uso de la pila, seis más redefiniendo irresponsablemente los operadores que no estoy usando, y uno más al no imprimir el espacio final después de las líneas de gracia.
Completamente golfizado:
Con comentarios:
fuente
Go. saldráoo|||:)Python,
250245242235 caracteres¡Un enfoque muy diferente que terminó superando a mi otro! El código de procesamiento de entrada es similar, pero eso es todo.
Mapeé el valor de cada personaje en función de la fila y la columna y luego desarrollé la impresión:
fuente
Java -
921907863 caracteresConstruyo cada cadena por separado, almacenando cada cadena en una matriz. Luego recorra la matriz e imprima cada línea.
Oh por favor no me odies, es mi primera vez. No puedo encontrar ninguna pregunta frecuente / introducción, así que espero que mi formato de publicación esté bien. No estoy seguro de cuán serias se pusieron las personas sobre el recuento de caracteres ... versión normal del código: adicional es linebreak / spaces (1313 caracteres):
fuente
args).[], espacios alrededor de paréntesis, etc.Haskell 377C
Versión sin golf:
fuente
CoffeeScript literario -
497527 caracteresEstoy seguro de que hay una mejor manera de construir la cuadrícula, pero no puedo entenderlo.
Un ayudante de golf.
AC mayor escala y personal.
Nuestra función de notación tomará la representación de cadena de una nota.
Primero determinaremos la octava.
Luego la nota y accidental. Tengo que amar la tarea de deconstruir.
Convirtamos la nota y la octava en un índice y grafiquemos la nota.
Ahora eliminaremos solo la cantidad de personal que necesitemos.
Y la nota de tallo.
Ahora produzcamos los resultados.
Finalmente, exportaremos la función para probar la consola. Estos personajes no cuentan para el total.
fuente
C,
325304¡Ahora 21 bytes más cortos gracias a @ace !
Salida:
fuente
ny puede eliminarlasi=0en el primerforbucle.ifdeclaración,((i%12)&11)==0se puede reemplazar con!((i%12)&11).?:tiene una precedencia muy inferior a^y<, por lo que puede eliminar los corchetes de las condiciones anteriores a?. Y puedes reemplazarprintf("%s",conputs(.JavaScript
390388Un pequeño desafío, debo admitirlo ... Estoy seguro de que hay formas de reducir esto aún más ... Estoy abierto a sugerencias ...
Primera iteración
Segunda iteración (usando en
n.slice(-1)lugar den[n.length-1]), afeita 2 bytesVersión sin golf:
fuente