De alguna manera extraño esas viejas demostraciones que muestran las capacidades de las computadoras cuando se llamaban x86 en lugar de i3, i5 e i7. Una de las primeras que vi en mi 386 fue la demostración de Unreal de Future Crew que ahora celebra su 25 aniversario. En el minuto 0:43 comienza la primera parte de la demostración y vemos un texto desplazable siguiendo una ruta sinusoidal. ¡Intentemos imitar ese efecto en el arte ASCII!
El reto
Dado este camino:
*** ***
*** ***
** **
* *
* *
* *
* *
** **
*** ***
******
y un texto de entrada, dibuje el texto siguiendo esa ruta, así:
Thi Golf!
s i de Yay
s Co !
P
r d
o n
g a
ra s
mmi zle
ng Puz
Tenga en cuenta que los espacios cuentan como caracteres en la ruta y que la ruta se repite si el texto es más largo que la muestra.
La parte de animación
Una vez que haya dibujado el texto, espere 100 ms (para crear una animación de alrededor de 10 fps) y vuelva a dibujar el texto pero comenzando desde la siguiente posición de la ruta. Entonces, para el marco #n
, calcule n modulo 40
y comience a dibujar en la siguiente posición de la ruta con el texto siempre alineado a la izquierda del lienzo:
*** ***
| *** *** |
| ** ** |
| * * |
| * * |
| * * |
| * * |
| ** ** |
| *** *** |
| ****** |
Position 0 Position 39
Entonces para el cuadro 10 tendremos:
and Co
es de
zl Go
z l
u f
T P !
h
is ng Ya
is mmi y!
Progra
Notas
- La entrada será simple
string
(ochar
matriz, lo que sea) con el texto para animar, y siempre tendrá al menos 1 carácter. - Los caracteres válidos para animar son aquellos en el conjunto ASCII imprimible .
- El camino a seguir será exactamente como se indica.
- El texto siempre estará alineado a la izquierda del lienzo, por lo que el efecto será el texto ondeando como una bandera, sin desplazamiento de texto. Y por lienzo me refiero a la pantalla o lo que sea que vayas a usar para mostrar el texto . ;-)
- Los cuadros deben estar libres de caracteres / píxeles de cuadros anteriores a menos que el carácter / píxel sea el mismo en ambos cuadros.
- La velocidad de la animación no importa siempre que se ejecute sin problemas o tan rápido como su dispositivo (podemos establecer un mínimo de 5 fps, pero esto no es un requisito). Simplemente ajuste la velocidad para que sea fluido y no se preocupe si los tiempos de espera no son exactamente los mismos.
- La animación se repetirá sin parar.
Este es el código de golf , ¡así que puede que gane el programa o la función más corta capaz de animar el texto!
Respuestas:
HTML + ES6,
241244237 bytesDescompostura:
¿Cómo?
Construyendo el camino
El siguiente código construye la ruta:
Esto proporciona una matriz de matrices
[j, y, z]
donde j es la posición del módulo 20, y es la coordenada y en esta posición yz no se usa más tarde (simplemente se calcula aquí para guardar algunos bytes).Debido a que la ruta es simétrica, solo necesitamos codificar las 20 primeras posiciones. Hacemos eso usando un número binario donde cada
1
bit significa que y debe actualizarse (+1 para la primera mitad, -1 para la segunda mitad).Con la primera posición asignada al bit menos significativo, esto da:
Debido a que este número binario también es simétrico, podemos leerlo en el mismo orden para la segunda mitad.
De ahí la fórmula:
que también se puede escribir como:
donde k es la posición y j es la posición módulo 20.
Actualizar x es mucho más fácil: solo tenemos que detectar un caso especial comparando el módulo de posición 20 con 9.
Dibujando el texto
En el siguiente código, el código de construcción de ruta descrito anteriormente ha sido reemplazado por una
path
variable para facilitar la lectura.fuente
*
en vertical no están alineadas (a la misma altura), y otra pequeña pica. Pero debo decir que todavía no sé cómo su código crea el efecto de onda (¿qué hacey+=155464
?). ¡Felicidades!