Puede o no recordar Xeyes, un programa de demostración que vino con (y, que yo sepa, todavía viene con) el sistema X Window. Su propósito era dibujar un par de ojos que siguieran el cursor del mouse:
Su desafío es recrear Xeyes con arte ASCII. Escriba un programa o función que dibuje dos ojos artísticos ASCII (especificados a continuación) donde el usuario haga clic y luego mueva sus pupilas para apuntar en la dirección del cursor.
El GIF anterior es una grabación de esta implementación de Ruby sin golf , que se puede ejecutar con cualquier versión reciente de Ruby. También puede resultarle útil como referencia para las secuencias de control de Xterm.
Presupuesto
Este es el código de golf , por lo que gana la solución con la menor cantidad de bytes.
Se trata de un ascii-art reto, por lo que su programa debe dibujar usando caracteres ASCII-específicamente, los personajes -
, .
, |
, '
, 0
, espacio, y la nueva línea. 1 2
Este es un desafío interactivo , por lo que su programa debe aceptar entradas y dibujar su salida en tiempo real. 3
Antes de que su programa comience a aceptar entradas, debe inicializar un lienzo en blanco de al menos 20 filas y 20 columnas. No debe dibujar nada hasta que el usuario haga clic en el lienzo.
Cada vez que el usuario hace clic en 4 en el lienzo, el programa debe borrar cualquier resultado anterior y luego dibujar estos ojos ASCII en el lienzo, centrados en el carácter más cercano a la ubicación del cursor del mouse. 5 6 (A continuación, ✧
representa el cursor del mouse y no se debe dibujar).
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Observe cómo los alumnos "apuntan" hacia el cursor.
Cada vez que el cursor del mouse se mueve sobre el lienzo, el programa debe volver a dibujar las pupilas para que continúen apuntando hacia el cursor, 7 por ejemplo:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Alumno señalando
Supongamos que enumeramos las posiciones de los nueve caracteres internos de cada ojo de la siguiente manera:
.---.
|678|
|591|
|432|
'---'
El alumno será dibujado en uno de los lugares 1
- 9
. Para decidir cuál, imagine que los caracteres son cuadrados y que el lienzo es una cuadrícula cartesiana, con el centro del 9
carácter en (0, 0), el centro de 1
en (1, 0), etc. Cuando el programa recibe una entrada, un clic o un movimiento, debe asignar la ubicación de entrada a la coordenada de cuadrícula más cercana 𝑀. Si 𝑀 es (0, 0), la pupila debe dibujarse en (0, 0), es decir, la ubicación del9
anterior. De lo contrario, se debe dibujar como se describe a continuación.
Imagine un plano cartesiano superpuesta a la rejilla y dividido en octantes numerados 1 - 8 :
Si 𝑀 se encuentra dentro del octante 1 , entonces la pupila debe dibujarse en la ubicación de 1
arriba, es decir, en (1, 0). Si 𝑀 está en octante 2 , debe dibujarse en 2
— y así sucesivamente. Para ilustrar, la siguiente imagen muestra parte de la cuadrícula codificada por colores según el lugar donde se debe dibujar la pupila cuando el cursor del mouse se encuentra en una ubicación particular. Cuando, por ejemplo, el cursor se encuentra en cualquiera de las coordenadas verdes (teniendo en cuenta que las coordenadas de la cuadrícula se encuentran en los centros de los cuadrados, no en sus esquinas), se debe dibujar la pupila 4
.
Las pupilas de los dos ojos se mueven independientemente, por lo que para cada ojo repita el proceso con 𝑀 en relación con el centro de ese ojo.
Notas
Este no es un desafío de salida gráfica . La salida debe ser una cuadrícula de caracteres. Por supuesto, puede usar rutinas gráficas para dibujar una cuadrícula de caracteres.
El espacio en blanco puede dibujarse (o, mejor dicho, no dibujarse), sin embargo, es conveniente. Un espacio vacío en la cuadrícula se ve igual que un carácter de espacio y se considerará equivalente.
"Tiempo real" se define aquí como menos de 200 ms entre la entrada y la salida correspondiente que se está dibujando.
Es a su discreción qué botones del mouse se observan para la entrada, y si presionar o soltar constituye un "clic".
El lienzo debe borrarse o se debe lograr el equivalente visual. Con una solución basada en terminal, por ejemplo, imprimir un nuevo lienzo debajo del lienzo anterior no se considera equivalente.
Cuando el usuario hace clic cerca del borde del lienzo de modo que algunos de los caracteres del ojo se dibujarían más allá de su borde, el comportamiento es indefinido. Sin embargo, el programa debe continuar ejecutándose normalmente en los clics posteriores.
Cuando el cursor del mouse sale del "lienzo", el comportamiento no está definido, pero el programa debe continuar ejecutándose normalmente cuando el cursor vuelve a entrar en el lienzo.
Puede aparecer un cursor de texto en el lienzo, siempre que no oscurezca el resultado.
Las lagunas estándar están prohibidas.
<pre>
o font-family:monospace
).