Falle die Maus!

8

Schreiben Sie das kürzestmögliche Programm, das den Mauszeiger in einem nach oben weisenden gleichseitigen Dreieck mit einer Seitenlänge von 274 Pixel und einem Schwerpunkt genau in der Mitte des Bildschirms einfängt.
(Dreieck wegen Käsespalten.)

Während Ihr Programm ausgeführt wird, sollte sich die Spitze des Cursors niemals außerhalb dieses Dreiecks bewegen können und sich innerhalb des Dreiecks bewegen und normal funktionieren. Wenn die EscTaste gedrückt wird, muss das Programm beendet werden und die Maus losgelassen werden.

Wertung

Dies ist Code-Golf, der kürzeste Code in Bytes gewinnt. Sie dürfen nur Standard-ASCII verwenden.

Einzelheiten

  • Neben Dingen wie dem Ausschalten des Computers oder dem Beenden des Vorgangs oder dem Drücken von Alt-F4oder Ctrl-Alt-Deletesollte die einzige Möglichkeit, den Cursor loszulassen, die EscTaste sein.
  • Befindet sich der Cursor beim Programmstart außerhalb des Dreiecks, sollte er irgendwo innerhalb des Dreiecks platziert werden.
  • Der Cursor muss sich reibungslos auf den beiden abgewinkelten Seiten der Dreiecke auf und ab bewegen können.
  • Wenn sich die Anzeige über mehrere Monitore erstreckt, wird das Dreieck möglicherweise in der Mitte eines Monitors oder in der Mitte aller Monitore zusammen angezeigt. (Wenn Sie nur einen Monitor haben, müssen Sie dies nicht testen.)
  • Es ist in Ordnung, wenn Touchscreen-Benutzer weiterhin auf Dinge außerhalb des Dreiecks klicken können.

Winzige Bonusfrage: Woher habe ich 274?

Calvins Hobbys
quelle
Winzige Bonusantwort: Die Seitenlänge wurde so gewählt, dass der Dreiecksbereich in 2 ^ 15 Pixel passt.
Egor Skriptunoff
3
Tini Bonus Antwort: Vielleicht wegen en.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448?
Fehler
@EgorSkriptunoff und Fehler Nope.
Calvins Hobbys
Wie messen Sie die 274 Pixel entlang der abgewinkelten Seiten des Dreiecks? Da jedes Pixel ein Quadrat ist, führt das Zählen von 274 Pixeln zu einem gleichschenkligen Dreieck, dessen Oberseite um den Faktor sqrt (2) länger als die Basis ist
Tymric
1
@Timmy Der Dreieckspeak sollte 274 Pixel im euklidischen Abstand von den beiden Endpunkten der Basis messen. Es ist in Ordnung, wenn Rundungsfehler dies unvollkommen machen.
Calvins Hobbys

Antworten:

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

Es hat keine eingebauten Min / Max-Funktionen, also habe ich 72 Zeichen damit verbracht, sie neu zu implementieren.

Drücken Sie t, um den Cursor abzufangen. Ich weiß nicht, ob es möglich ist, Dinge zu tun, ohne sie einem Hotkey zuzuweisen.

Die Bewegung ist nicht sehr flüssig, es sei denn, Sie bewegen die Maus langsam

Geben Sie hier die Bildbeschreibung ein

DenDenDo
quelle
2

Python 418 351 314 300 263 Bytes

Bearbeiten: Gespeichert 67 104 118 155 Bytes dank der Hinweise in den Kommentaren

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))))

Pywin wurde in Python 3.4.1 unter Windows geschrieben und muss installiert werden.

Meine erste Code Golf Einreichung. Bitte zögern Sie nicht, Verbesserungen vorzuschlagen

Tymric
quelle
1
Korrigieren Sie mich, wenn ich falsch liege, aber Sie können tun, from ... import*was 3 Bytes in Ihrem Code spart
Eric Lagergren
1
Sie können schreiben , 274/2als 1372 - Zeichen zu speichern. Zuweisen des gemeinsamen subexpression y-2*S/czu einem Ein-Buchstaben - var und Referenzierung in dund esollte etwas mehr sparen. Das if b<X:b=int(X)Muster kann wahrscheinlich wie geschrieben b=max(b,int(X))(bzw. >mit min umgeschrieben) werden. Schließlich gibt es wahrscheinlich noch etwas Leerzeichen zum Herausdrücken, z . B. zwischen kbhit()und and.
Algorithmushai
1
Da Sie einige Funktionen mehr als einmal verwenden, sollten Sie sie einem kürzeren Namen zuweisen G=GetSystemMetrics;x=G(0)/2;y=G(1)/2(da die Auflösungen immer eine Ganzzahl und ein Vielfaches von 2 sind, können Sie 2 Schrägstriche speichern). Dies gilt auch für SetCursorPos. Und wenn Sie c = 3 **. 5 verwenden, müssen Sie keine Mathematik importieren
DenDenDo
1
Sie können weitere 3 Bytes speichern, indem Sie map: b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c]))). Sie brauchen auch nicht die Parens herum aund b: a,b=GetCursorPos()das spart 2 Bytes. Sie müssen auch nicht neu berechnen und speichern aund b. Fügen Sie einfach die Berechnungen in den Aufruf von S: ein, S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))der 4 Byte spart.
BeetDemGuise
1
Wenn Sie nicht über das Kurzschlussverhalten benötigen and, können Sie ersetzen kbhit()and ord(getch())==27mit kbhit()*ord(getch())==273 Zeichen zu speichern, weil Wahre gegossen wird auf 1 und Falsch wird auf 0 in Python gegossen. Sie können auch die erste und die zweite Zeile der while-Schleife in dieselbe Zeile einfügen, die durch ein Semikolon getrennt ist, um ein anderes Zeichen zu speichern. Schließlich verwenden Sie nur dund eje einmal, so gibt es keinen Punkt in sie als Variable definieren. Einfach Y-c*xund Y+c*xin den richtigen Stellen.
isaacg