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.
fuente
<pre>
ofont-family:monospace
).Respuestas:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 bytesfuente
X||Y
se pueden jugarX|Y
para guardar 2 bytes.|
termina teniendo prioridad sobre la expresión ternaria.|
y está||
en el mismo nivel, y ambos arriba?:
. AmbosX||Y?w*r(cos(a)):0
yX||Y?h*r(sin(a)):0
actualmente están en el formularioboolean_condition?A:B
. Entonces, cuando cambiesX||Y
aX|Y
él, hará un OR inteligente y luego interpretará como una condición booleana nuevamente. ((X||Y)?A:B
vs(X|Y)?A:B
, noX|(Y?A:B)
). Además, no veo ninguna diferencia cuando uso "Copiar fragmento para responder" y cambio el||
a|
. Todo sigue funcionando exactamente igual hasta donde puedo decir ..Excel VBA, 630 bytes
Subrutina de hoja de trabajo declarada que se ejecuta al hacer clic con el mouse, que no toma ninguna entrada y produce un par de ojos que siguen el cursor. Esto depende de la función auxiliar incluida y la declaración de tipo, que debe colocarse en un módulo normal.
Esta versión está calibrada para ejecutarse con el zoom predeterminado del 100%. Se rompe si intentas desplazarte.
Función auxiliar y declaración de tipo
No golfista y comentado
Esta versión está calibrada para ejecutarse a un nivel de zoom del 400%.
Función auxiliar y declaración de tipo
Salida
GIF
Imagen de mayor resolución
fuente
'
carácter más a la derecha de la salida será diferente de cuando está en el'
carácter más a la izquierda . 2. La posición de los ojos no es fija. Un clic del mouse debería hacer que se muevan a la posición en la que se hizo clic. Soy flexible en el método de entrada (aceptaría, por ejemplo, un cursor virtual del mouse controlado por las teclas de flecha), pero hay dos eventos de entrada distintos con un comportamiento distinto: movimiento del mouse y clic del mouse.Worksheet_SelectionChange
evento y pasará el rango de llamada (Target
oT
en este caso), que vuelve a dibujar los ojos y a*
en la llamada celularQBasic ( QB64 ),
361305 bytesEl clic izquierdo coloca los ojos. Si la colocación de los ojos resultara en parte de los ojos fuera de límites, el programa se "congela" hasta que se realice una colocación válida.
La principal parte difícil es colocar las pupilas. La mayoría de las veces, las coordenadas de la pupila son solo el centro del ojo más (signo (Δx), signo (Δy)), excepto que en los octantes 1 y 5, la coordenada y es igual al centro y, y en octantes 3 y 7, la coordenada x es igual al centro x. Los límites de octava se pueden calcular utilizando la pendiente
m
de la línea desde el centro del ojo hasta las coordenadas del mouse. Convenientemente, dividir por cero al calcular la pendiente da infinito en coma flotante (+/-) en lugar de un error.Sin golf
fuente
?0
lugar de?"0"
? Esto sugiere que puede usar una expresión numérica y cadenas."| |"
. Por lo tanto, probablemente no guardaría nada."0"
es solo 2 bytes más largo.Código de máquina 6502 ( mouse C64 + 1351 ), 630 bytes
En acción:
No hay demostración en línea , lo siento, porque hay un emulador AFAIK no js C64 que admite un mouse. Si quieres probarlo tú mismo, toma VICE , descarga el ejecutable binario e inícialo en el emulador C64:
Para tomar / quitar la entrada del mouse en el emulador en ejecución, úsela
ctrl+m
en Unix / Linux yctrl+q
en Windows.Sí, esto se tenía que hacer;) Después de todo, no es un ratón Commodore original para el C64, pero por supuesto, el sistema operativo incorporado no lo soporta, por lo que primero necesitaba un controlador de ratón, que ya se llevó a 230 bytes ( incluido un sprite de hardware en forma de cursor del mouse y un código de verificación de límites para el área de la pantalla, pero sin traducir las coordenadas del puntero a las coordenadas de la pantalla de texto).
Si está interesado, puede leer el código como fuente de ensamblaje aquí :)
fuente
Limpio ,
1014904892884840814782772769 bytes-6 bytes si los ojos no necesitan ajustarse a una cuadrícula
Esto no fue fácil. Las IU en lenguajes funcionales rara vez lo son.
Asegúrese de estar usando iTasks Clean, tener la
Courier
fuente instalada yStdLib
ANTES de cualquier subcarpetaObjectIO
en la ruta de búsqueda del módulo.Compilar con (ejemplo, puede diferir):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Si nunca antes ha ejecutado Clean, espere que este proyecto tarde más de 5 minutos en compilarse.
Sin golf:
Como puede ver en la versión no adaptada, la mayor parte del código está configurando la combinación de "fuente monoespaciada" con "responder al mouse". Y aunque
Courier
no lo hace fácil de decir, en realidad está dibujando los.
sy'
s. Cambiar a algo así loConsolas
hace más claro.fuente
(abs m)<9&&(abs n)<w='9'
a(abs m)<9&(abs n)<w='9'
? Además, sugiero agregar una pantalla a gif en lugar de una captura de pantalla.Rubí, 335 + 13 = 348 bytes
+13 bytes para que la
-rio/console
bandera habiliteIO#getch
.Contiene
0x1b
caracteres ESC ( ) literales , como se muestra a␛
continuación. xxd dump sigue.Precaución: Esto no se limpia después de sí mismo en la salida. Vea la nota debajo del volcado xxd a continuación.
Sin golf
Este es un golf bastante ingenuo de mi implementación original de Ruby .
volcado xxd
Este programa activa el seguimiento del mouse con la secuencia de control xterm
\e[?1003h
pero no lo desactiva al salir. Para apagarlo, use la secuencia de control\e[?1003l
, por ejemplo:Como el programa se come todas las entradas, es difícil salir. Si desea salir presionando Ctrl + C, agregue la siguiente línea a continuación
(s<<STDIN.getch
:Sin más preámbulos:
fuente