¡Atrapa el ratón!

8

Escriba el programa más corto posible que atrape el cursor del mouse dentro de un triángulo equilátero que apunta hacia arriba con una longitud lateral de 274 píxeles y un centroide en el centro exacto de la pantalla.
(Triángulo debido a las cuñas de queso).

Mientras su programa se está ejecutando, la punta del cursor nunca debería poder moverse fuera de este triángulo, y debería moverse y funcionar normalmente dentro. Cuando se Escpresiona la tecla, el programa debe finalizar, soltando el mouse.

Puntuación

Este es el código de golf, gana el código más corto en bytes. Solo puede usar ASCII estándar.

Detalles

  • Además de cosas como apagar la computadora o matar el proceso o presionar Alt-F4o Ctrl-Alt-Delete, la única forma de soltar el cursor debería ser la Esctecla.
  • Si el cursor está fuera del triángulo cuando se inicia el programa, debe colocarse en algún lugar dentro.
  • El cursor debe poder moverse suavemente hacia arriba y hacia abajo en los dos lados angulados de los triángulos.
  • Si la pantalla se extiende sobre varios monitores, el triángulo puede aparecer en el centro de cualquier monitor o en el centro de todos ellos combinados. (Si solo tiene un monitor, no necesita probarlo).
  • Está bien si los usuarios de la pantalla táctil aún pueden hacer clic fuera del triángulo.

Pequeña pregunta extra: ¿de dónde obtuve 274?

Pasatiempos de Calvin
fuente
Pequeña respuesta de bonificación: ¿se eligió la longitud del lado para ajustar el área del triángulo en 2 ^ 15 píxeles?
Egor Skriptunoff
3
Respuesta de bonificación de Tini: ¿Quizás por en.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448?
flawr
@EgorSkriptunoff y flawr Nope.
Aficiones de Calvin
¿Cómo estás midiendo los 274 píxeles a lo largo de los lados angulados del triángulo? Como cada píxel es un cuadrado, contar 274 píxeles dará como resultado un triángulo isósceles cuyos lados superiores son más largos que la base por un factor de sqrt (2)
Tymric
1
@Timmy El pico del triángulo debe medir 274 píxeles en distancia euclidiana desde los dos puntos finales de la base. Está bien si el error de redondeo lo hace imperfecto.
Aficiones de Calvin

Respuestas:

0

AutoHotKey (249)

CoordMode,Mouse
Esc::ExitApp
U(a,b){
return(a+b+abs(a-b))/2
}
L(a,b){
return(a+b-abs(a-b))/2
}
t::
SysGet,X,0
Sysget,Y,1
M:=X/2
N:=Y/2
Loop{
MouseGetPos,x,y
MouseMove L(U(M-137,x),M+137),L(U(N-118+1.732*abs(x-M),y),N+119),0
}
return

No tiene funciones mín. / Máx. Incorporadas, así que pasé 72 caracteres reimplementándolas.

Presione tpara atrapar el cursor, no sé si es posible hacer cosas sin asignarlo a una tecla de acceso rápido.

El movimiento no es muy suave, a menos que mueva el mouse lentamente

ingrese la descripción de la imagen aquí

DenDenDo
fuente
2

Python 418 351 314 300 263 Bytes

Editar: Guardado 67 104 118 155 bytes gracias a los consejos en los comentarios

from win32api import*
from msvcrt import*
s=137
G=GetSystemMetrics
S=SetCursorPos
x=G(0)//2
y=G(1)//2
c=3**.5
Y=y-2*s/c
S((x,y))
while(kbhit()and ord(getch())==27)<1:a,b=GetCursorPos();S((min(max(a,x-s),x+s),min(max(b,int(c*a+Y-c*x),int(-c*a+Y+c*x)),int(y+s/c))))

Escrito en Python 3.4.1 en Windows, pywin necesita ser instalado.

Mi primer envío de código de golf. Por favor, siéntase libre de sugerir mejoras

Tímbrico
fuente
1
Corrígeme si me equivoco, pero puedes hacer lo from ... import*que ahorra 3 bytes en tu código
Eric Lagergren
1
Puede escribir 274/2como 137para guardar 2 caracteres. Asignar la subexpresión común y-2*S/ca una variable de una letra y hacer referencia a ella dy edebería guardar algo más. El if b<X:b=int(X)patrón probablemente puede escribirse como b=max(b,int(X))(y >reescribirse con min, respectivamente). Finalmente, probablemente haya más espacio en blanco para exprimir, por ejemplo, entre kbhit()y and.
algorithmshark
1
ya que está utilizando algunas funciones más de una vez, debe asignarlas a un nombre más corto G=GetSystemMetrics;x=G(0)/2;y=G(1)/2(dado que las resoluciones son siempre un número entero y múltiplo de 2, puede guardar 2 barras), lo mismo para SetCursorPos. Y si usa c = 3 **. 5, entonces no necesita importar matemáticas
DenDenDo
1
Puede guardar otros 3bytes mediante el uso de map: b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c]))). Tampoco necesita los parens ay b: lo a,b=GetCursorPos()que ahorra 2bytes. Tampoco es necesario volver a calcular y almacenar ay b. Simplemente ponga los cálculos en la llamada a S: S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))que ahorra 4bytes.
BeetDemGuise
1
Si no necesita el comportamiento de cortocircuito and, puede reemplazar kbhit()and ord(getch())==27con kbhit()*ord(getch())==27para guardar 3 caracteres, porque True se convierte en 1 y False se convierte en 0 en Python. Además, puede colocar las líneas primera y segunda del ciclo while en la misma línea, separadas por un punto y coma, para guardar otro carácter. Por último, sólo vas a usar dy euna vez cada uno, por lo que no hay ningún punto en definirlos como variable. Simplemente ponga Y-c*xy Y+c*xen los lugares adecuados.
isaacg