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 Esc
Taste 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-F4
oderCtrl-Alt-Delete
sollte die einzige Möglichkeit, den Cursor loszulassen, dieEsc
Taste 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?
Antworten:
AutoHotKey (249)
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
quelle
Python
418351314300263 BytesBearbeiten: Gespeichert
67104118155 Bytes dank der Hinweise in den KommentarenPywin 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
quelle
from ... import*
was 3 Bytes in Ihrem Code spart274/2
als137
2 - Zeichen zu speichern. Zuweisen des gemeinsamen subexpressiony-2*S/c
zu einem Ein-Buchstaben - var und Referenzierung ind
unde
sollte etwas mehr sparen. Dasif b<X:b=int(X)
Muster kann wahrscheinlich wie geschriebenb=max(b,int(X))
(bzw.>
mit min umgeschrieben) werden. Schließlich gibt es wahrscheinlich noch etwas Leerzeichen zum Herausdrücken, z . B. zwischenkbhit()
undand
.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 importierenmap
:b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c])))
. Sie brauchen auch nicht die Parens heruma
undb
:a,b=GetCursorPos()
das spart 2 Bytes. Sie müssen auch nicht neu berechnen und speicherna
undb
. Fügen Sie einfach die Berechnungen in den Aufruf vonS
: 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.and
, können Sie ersetzenkbhit()and ord(getch())==27
mitkbhit()*ord(getch())==27
3 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 nurd
unde
je einmal, so gibt es keinen Punkt in sie als Variable definieren. EinfachY-c*x
undY+c*x
in den richtigen Stellen.