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 G
y 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
H
oL
, especificando "alto" o "bajo" - una carta de
A
aG
, 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
#
ob
un 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
#
ob
a 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.if
que 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
n
y puede eliminarlasi=0
en el primerfor
bucle.if
declaración,((i%12)&11)==0
se 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