Fondo
Aquí hay un desafío relacionado con Halloween.
Como habrás visto en mi último desafío, me gusta bastante lo que llamo animaciones de arte ascii, que no es solo dibujar un patrón, sino dibujar un patrón que progresa. Esta idea se me ocurrió después de que me pidieron hace un par de años animar una presentación (bastante aburrida) haciendo que murciélagos ascii al azar vuelen por la pantalla en Halloween. No hace falta decir que lo hice debidamente (me pagaban por ello) pero me hizo pensar que hay más en la vida que murciélagos aleatorios. Inspirado por esto, me gustaría proponer este desafío.
Reto
Haz que un murciélago vuele alrededor de la luna.
Aquí hay un murciélago:
^o^
Aquí está la luna:
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Debe mostrar cada etapa del vuelo de los murciélagos (ver salida).
Entrada
Ninguna
Salida
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm^o^
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm^o^
mmmmmmmmm
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm^o^
mmmmmmm
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm^o^
mmm
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
^o^mmm
mmm
mmmmmmm
mmmmmmmmm
^o^mmmmmmm
mmm
mmm
mmmmmmm
^o^mmmmmmmmm
mmmmmmm
mmm
mmm
^o^mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
^o^
mmm
mmmmmmm
mmmmmmmmm
mmmmmmm
mmm
Reglas
- Sin lectura de archivos externos o sitios web
- Puede enviar un programa completo o una función
- Los espacios adicionales y / o las nuevas líneas están bien para mí.
- Lagunas estándar prohibidas como de costumbre
- El murciélago debe terminar de nuevo en la cima de la luna.
- Si lo desea, siéntase libre de borrar la pantalla entre cuadros, sin embargo, esto no es un requisito. La salida como se muestra arriba está bien
- Como se trata de un código de golf, el ganador será la respuesta con el menor recuento de bytes, aunque cualquier respuesta es bienvenida
Muestra
Implementación de referencia en Python 2 totalmente sin golf (620 bytes pero solo para demostrar que se puede hacer. Puede jugarlo más tarde).
b='^o^'
m=[' ',
' mmm ',
' mmmmmmm ',
' mmmmmmmmm ',
' mmmmmmm ',
' mmm ',
' ']
p=[(9,12),(12,15),(14,17),(15,18),(14,17),(12,15),(9,12),(6,9),(4,7),(3,6),(4,7),(6,9),(9,12)]
d=0
for z in range(7):
x=map(str,m[z])
c="".join(x[:p[z][0]]) + b + "".join(x[p[z][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
for z in range(6)[::-1]:
x=map(str,m[z])
c="".join(x[:p[z+6][0]]) + b + "".join(x[p[z+6][1]:])+"\n"
print "\n".join(m[:z]) + "\n" + c+"\n".join(m[z+1:])
Resultado
Aunque @Jonathan obviamente gana en conteo de bytes con Jelly, voy a marcar la respuesta Brainfuck de @Oyarsa como la respuesta aceptada simplemente porque creo que cualquiera que pueda hacer algo como esto en un lenguaje tan loco merece +15 rep no importa cuantos bytes se necesitan Esto no es porque tenga ningún problema con los idiomas de golf. Vea mi respuesta a una pregunta sobre esto en meta si tiene alguna duda. Muchas gracias y respeto a todos los que contribuyeron en cualquier idioma.
Respuestas:
Brainfuck, 690 bytes
Esta es mi primera vez jugando al golf, así que estoy seguro de que todavía hay mucho margen de mejora
Pruébalo en línea
Ungolfed algunos para facilitar la lectura:
Quería usar el hecho de que al agregar una nueva línea al comienzo, cada etapa se puede leer en ambas direcciones para obtener dos etapas diferentes, pero no pude encontrar una buena manera de hacerlo sin generar las seis etapas y media completas En seguida.
fuente
05AB1E ,
696260 bytesGuardado 2 bytes gracias a Adnan .
Pruébalo en línea!
Explicación
3ð×…^o^)U
almacena la lista[" ","^o^"]
en X para su uso posterior.13FNV
bucles sobre las 13 etapas [0 .. 12] y almacena el índice de iteración actual en Y .0379730v
recorre las filas de cada etapa,donde N es el índice de la fila e y es el número actual de m .
Comenzamos agregando
floor(5/(y+1))-(y==0)
espacios a cada fila conð5y>;ï-y_+×
.Luego determinamos si debería haber un murciélago o 3 espacios antes de los m .
Si
(-N-Y)%12 == 0
es cierto, agregamos un murciélago, de lo contrario 3 espacios.Esta expresión (
N(Y-12%_Xè
) colocará a los murciélagos en etapas0,6-12
.Luego colocamos y m's con
'my×
.Ahora determinamos si debe haber un murciélago o 3 espacios después de las m .
El código
NY-12%_y&Xè
colocará un murciélago si((N-Y)%12 == 0) and y!=0
es verdadero, de lo contrario 3 espacios.Esto colocará a los murciélagos en los escenarios
1-5
.Finalmente nos unimos a toda la fila en una cadena y de impresión con un salto de línea:
J,
.fuente
3ð×…^o^)
en lugar de" ^o^"2ä
debería guardar dos bytes.3ð×
.JavaScript (ES6),
109144140138 bytesVersión animada
Mostrar fragmento de código
fuente
HTML + JS,
153149 bytesEditar: ahorró un montón de bytes gracias a @RickHitchcock. La versión aburrida que solo devuelve las 13 cadenas multilínea en una matriz es
132131 bytes:fuente
setInterval
, que siempre es el mismo en mi navegador, pero puede variar para otros navegadores.innerHTML
lugar detextContent
. Y otro byte cambiandorepeat(+c)
arepeat(c)
.1000
puede llegar a ser1e3
.)Gelatina ,
76 6958 bytesTryItOnline
¿Cómo?
fuente
Python 2,
146 144138 bytes-2 bytes gracias a @Willem (use la variable en
c
lugar de recorrer amap
)repl.it
'6643466'
es el número de espacios antes de la luna (con 6 en la primera y última línea vacía, ya que el murciélago irá allí).'0379730'
es el número de'm'
s en la luna en cada línea.El
zip
desempaqueta estos personajes ena
yb
hace la luna en el cielom
, con 3 espacios finales en cada línea.La última línea atraviesa las posiciones del murciélago dentro de la luna y es efectivamente:
pero la tupla de posiciones está codificada como ordinales de caracteres imprimibles, con un agregado de 23 (ya que 9 no es imprimible). Esto aparece como
" -;L[hrbQ@2' "
yc=ord(b)-23
se usa para extraer los valores.fuente
for b in" -;L[hrbQ@2' ":c=ord(b)-23;print(m[:c-3]+'^o^'+m[c:])
Autovim ,
8581 bytesSin animación, probablemente todavía golfable ... Aún así, ¡no está mal para el nuevo chico de la cuadra! (autovim)
Para ejecutarlo:
Explicación
En resumen, dibujamos la luna, la copiamos y pegamos 12 veces, y usamos dos macros: una para agregar el murciélago a las primeras 7 lunas, y la otra para anteponer las últimas 6.
fuente
PHP, 167 bytes
Hice un pequeño programa en PHP:
Aquí hay una versión más detallada:
Este es mi primer codegolf, si tienes alguna sugerencia, estoy feliz de escuchar :)
fuente
Python 2, 112 bytes
Imprime la imagen. Cada línea tiene tres partes
m
's para la lunaEstas partes están concatenadas y centradas en una caja de tamaño 15 para espaciar. Para evitar que los murciélagos desplacen el centro, un murciélago perdido tiene tres espacios, la misma longitud. Para los murciélagos en la parte superior o inferior de la luna, se omite la ranura de la barra izquierda y se ocupa la ranura de la derecha.
Hay 91 líneas: una imagen de 7 líneas para cada una de las 13 imágenes. Estos se cuentan a través de divmod: como
k
cuenta de0
a91
,(k/7, k%7)
vaTomando el primer valor
k/7
como imagen y el segundo valorr=k%7
como el número de fila dentro de la imagen, esto cuenta primero por imagen, luego por número de fila dentro de cada imagen, ambos indexados a 0.El número de
m
's en la luna cambia con el número de filar=k%7
como[0,3,7,9,7,3,0]
. En lugar de indexar esto, una fórmula fue más corta. Un conveniente grado de libertad es que el0
's puede ser cualquier valor negativo, ya que esto todavía da la cadena vacía cuando se multiplica porm
. Jugar con una parábola y dividir el piso dio una fórmular*(6-r)*8/5-5
.Ahora, buscamos seleccionar si dibujar un murciélago o un espacio vacío a cada lado. La matriz
b=[' ','^o^']
contiene las opciones.El bate en la fila 0 en la imagen 0 (en la parte superior), en la fila 1 en la imagen 1 (a la derecha), en la fila 6 en la imagen 6 (en la parte superior). Por lo tanto, es fácil comprobar si aparece como la fila y el número de la imagen como si fueran iguales,
k/7==r
. Pero también necesitamos que la imagen 12 se parezca a la imagen 0, por lo que tomamos primero el número de imagen módulo 12.A la izquierda es similar. El murciélago aparece a la izquierda en filas
r=5,4,3,2,1
en las imágenes7,8,9,10,11
. Por lo tanto, verificamos si la fila y el número de la imagen suman 12. También nos aseguramos de dibujar nada en lugar de tres espacios en las filas0
y6
, la ranura derecha del bate dibujará el bate, y no debemos estropear su centrado.fuente
DO#,
615582337 bytesEste es mi primer intento (todavía demasiado legible) en uno de estos, ¡así que con gusto agradeceré cualquier sugerencia para reducir unos cientos de bytes! La parte superior de mi lista en este momento es una forma más corta de crear la matriz de la luna.
Sin golf (¡incluye bucle!)
Editar:
Eliminó 21 bytes eliminando espacios finales en la declaración de matriz. En lugar de una cuadrícula de 15 caracteres de ancho, cada fila es lo suficientemente ancha como para que quepa el bate. Se eliminaron otros 12 para los argumentos innecesarios string [] en la
Main()
declaración.Edición 2:
¡Reescribió la mayor parte de la lógica, eliminando 245 bytes! Incluye cambios sugeridos de los comentarios. ¡Gracias!
De los comentarios, convertí esto en una función en
M()
lugar delMain()
método anterior , por lo que ahora, esto debe llamarse externamente.fuente
new string[]
dem
y simplemente colocandostring[]m={...}
.var
's en lugares comostring[]w=(string[])m.Clone();
-var w=(strin[])m.Clone();
Python 2,
299300290270 bytesGolfé hasta 270 después de haber ganado un poco más de experiencia en el golf.
La implementación de referencia se redujo en
321320330 bytes. No es bonita ni elegante. Solo usa cadena de fuerza bruta y corte de lista. Sin embargo, fue divertido obtener la cuenta regresiva del byte, pero creo que el enfoque fue completamente incorrecto para un competidor serio.No espero que esta respuesta se tome en serio, así que por favor no hay votos negativos. Dije en la pregunta que intentaría jugar golf con la implementación de referencia y esto es exactamente eso. Recién publicado por diversión.
Pruébalo en línea!
fuente
Ruby,
164156bytesPrograma muy simple. Se puede trabajar en más. Por favor, deje consejos en los comentarios.
fuente
base64
yzlib
de la manera más corta posible y agregarlas al recuento de bytes?puts
ysay
? No estoy familiarizado con Ruby./// , 205 bytes
Pruébalo en línea!
Solo si no necesito toneladas de espacios finales ...
fuente
Paperas, 223 bytes
Esto utiliza InterSystems Cache Mumps: permite llaves alrededor de los bucles, lo que lo hace útil para bucles anidados en una sola línea.
Probablemente podría jugar más al golf, y puedo jugar con eso cuando tenga más tiempo. Agregue otros 9 bytes y se animará [[debido a la adición de 'H 1 W #' -> que se detiene por un segundo y borra la pantalla:
Aquí hay una versión no escrita / explicada (de la versión de animación), con las declaraciones correctas de 'hacer' y bucles de puntos:
Traté de hacer el jazz "comprimir y luego codificar Base-64" solo para ver qué pasaría, ¡pero la cadena codificada terminó un poco más que el programa mismo! Eso, y el sistema de Cache requiere que la compresión y la codificación base64 sean bastante largas ... por ejemplo, aquí está la llamada al sistema para decodificar base64: $ System.Encryption.Base64Decode (STRING)
Ese método 'hincharía' el programa a más de 300 caracteres, creo ...
fuente