Prenda o mouse!

8

Escreva o programa mais curto possível que prende o cursor do mouse dentro de um triângulo equilátero apontando para cima, com um comprimento lateral de 274 pixels e um centróide no exato centro da tela.
(Triângulo por causa das fatias de queijo.)

Enquanto seu programa estiver em execução, a ponta do cursor nunca poderá se mover para fora desse triângulo e deve se mover e funcionar normalmente dentro. Quando a Esctecla é pressionada, o programa deve terminar, liberando o mouse.

Pontuação

Isso é código-golfe, o código mais curto em bytes vence. Você pode usar apenas o padrão ASCII.

Detalhes

  • Além de coisas como desligar o computador ou interromper o processo ou pressionar Alt-F4ou Ctrl-Alt-Delete, a única maneira de liberar o cursor deve ser a Esctecla.
  • Se o cursor estiver fora do triângulo quando o programa for iniciado, ele deverá ser colocado em algum lugar dentro.
  • O cursor deve poder mover-se suavemente para cima e para baixo nos dois lados angulares dos triângulos.
  • Se a exibição for estendida por vários monitores, o triângulo poderá aparecer no centro de qualquer monitor ou no centro de todos eles combinados. (Se você possui apenas um monitor, não precisa testar isso.)
  • Tudo bem se os usuários da tela de toque ainda puderem clicar em itens fora do triângulo.

Pequena pergunta sobre bônus: De onde eu recebi 274?

Passatempos de Calvin
fonte
Resposta minúscula do bônus: o comprimento lateral foi escolhido para ajustar a área do triângulo em 2 ^ 15 pixels?
Egor Skriptunoff 01/08/14
3
Resposta de bônus Tini: Talvez por causa de en.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448?
flawr
@EgorSkriptunoff e flawr Nope.
Hobbies de Calvin
Como você mede os 274 pixels ao longo dos lados angulares do triângulo? Como cada pixel é um quadrado, contando 274 pixels irá resultar em um triângulo isósceles cujos lados superior são mais longos do que a base por um fator de sqrt (2)
Tymric
1
@ Timmy O pico do triângulo deve medir 274 pixels na distância euclidiana dos dois pontos finais da base. Não há problema se o erro de arredondamento o torna imperfeito.
Hobbies de Calvin

Respostas:

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

Ele não possui funções mínimas / máximas, então gastei 72 caracteres reimplementando-as.

Pressione tpara prender o cursor, não sei se é possível fazer coisas sem atribuí-lo a uma tecla de atalho.

O movimento não é muito suave, a menos que você mova o mouse lentamente

insira a descrição da imagem aqui

DenDenDo
fonte
2

Pitão 418 351 314 300 263 Bytes

Edit: Saved 67 104 118 155 Bytes, graças aos conselhos dos comentários

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 em Python 3.4.1 no Windows, o pywin precisa ser instalado.

Meu primeiro envio de código de golfe. Sinta-se livre para sugerir melhorias

Tymric
fonte
1
Corrija-me se eu estiver errado, mas você pode fazer from ... import*o que economiza 3 bytes em seu código
Eric Lagergren
1
Você pode escrever 274/2como 137para salvar 2 caracteres. Atribuir a subexpressão comum y-2*S/ca uma var de uma letra e fazer referência a ela de edeve economizar um pouco mais. O if b<X:b=int(X)padrão provavelmente pode ser escrito como b=max(b,int(X))(e >reescrito com min, respectivamente). Finalmente, provavelmente há mais espaço em branco a ser extraído, por exemplo, entre kbhit()e and.
algorithmshark
1
como você está usando algumas funções mais do que uma vez, você deve atribuí-las a um nome mais curto G=GetSystemMetrics;x=G(0)/2;y=G(1)/2(já que as resoluções são sempre um número inteiro e múltiplo de 2, é possível salvar 2 barras), o mesmo para SetCursorPos. . E se você usar c = 3 ** 5, em seguida, você não precisa de matemática importação
DenDenDo
1
Você pode economizar mais 3bytes usando map: b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c]))). Você também não precisa dos parâmetros ae b: a,b=GetCursorPos()que economiza 2 bytes. Você TAMBÉM não precisa recalcular e armazenar ae b. Basta colocar os cálculos na chamada para S: o S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))que economiza 4 bytes.
BeetDemGuise
1
Se você não precisar do comportamento de curto-circuito de and, poderá substituir kbhit()and ord(getch())==27por kbhit()*ord(getch())==27para salvar 3 caracteres, porque True é convertido em 1 e False é convertido em 0 no Python. Além disso, você pode colocar a primeira e a segunda linhas do loop while na mesma linha, separadas por ponto e vírgula, para salvar outro caractere. Por fim, você usa apenas uma vez de ecada uma, para que não faça sentido defini-las como variáveis. Basta colocar Y-c*xe Y+c*xnos locais adequados.
Isaacg