Perangkap mouse!

8

Tuliskan program sesingkat mungkin yang menjebak kursor mouse di dalam segitiga sama sisi menunjuk ke atas dengan panjang sisi 274 piksel dan centroid di tengah-tengah layar.
(Segitiga karena irisan keju.)

Saat program Anda berjalan, ujung kursor seharusnya tidak dapat bergerak di luar segitiga ini, dan harus bergerak dan berfungsi secara normal di dalam. Ketika tombol Escditekan, program harus diakhiri, melepaskan mouse.

Mencetak gol

Ini adalah kode-golf, kode terpendek dalam byte menang. Anda hanya dapat menggunakan ASCII standar.

Detail

  • Selain hal-hal seperti mematikan komputer atau mematikan proses atau menekan Alt-F4atau Ctrl-Alt-Delete, satu-satunya cara untuk melepaskan kursor adalah Esckuncinya.
  • Jika kursor berada di luar segitiga ketika program dimulai harus diletakkan di suatu tempat di dalam.
  • Kursor harus dapat bergerak dengan lancar ke atas dan ke bawah dua sisi siku dari segitiga.
  • Jika layar diperluas lebih dari beberapa monitor, segitiga dapat muncul di bagian tengah dari satu monitor atau bagian tengah dari semuanya yang digabungkan. (Jika Anda hanya memiliki satu monitor, Anda tidak perlu menguji ini.)
  • Tidak masalah jika pengguna layar sentuh masih dapat mengklik hal-hal di luar segitiga.

Pertanyaan bonus kecil: Dari mana saya dapatkan 274?

Hobi Calvin
sumber
Jawaban bonus kecil: panjang sisi dipilih agar sesuai dengan area segitiga menjadi 2 ^ 15 piksel?
Egor Skriptunoff
3
Tini bonus jawaban: Mungkin karena en.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448?
flawr
@EgorSkriptunoff dan flawr Tidak.
Calvin Hobbies
Bagaimana Anda mengukur 274 piksel di sepanjang sisi miring dari segitiga? Karena setiap piksel adalah kuadrat, menghitung 274 piksel akan menghasilkan segitiga sama kaki yang sisi atasnya lebih panjang dari alas dengan faktor sqrt (2)
Tymric
1
@ Timmy Puncak segitiga harus mengukur 274 piksel dalam jarak Euclidean dari dua titik akhir pangkalan. Tidak masalah jika kesalahan pembulatan membuat ini tidak sempurna.
Calvin Hobbies

Jawaban:

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

Itu tidak memiliki fungsi min / max inbuilt, jadi saya menghabiskan 72 karakter untuk mengimplementasikannya.

Tekan tuntuk menjebak kursor, saya tidak tahu apakah mungkin untuk melakukan hal-hal tanpa menugaskannya ke hotkey.

Gerakannya tidak terlalu mulus, kecuali jika Anda menggerakkan mouse dengan lambat

masukkan deskripsi gambar di sini

DenDenDo
sumber
2

Python 418 351 314 300 263 Bytes

Sunting: Disimpan 67 104 118 155 Bytes berkat saran dalam komentar

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

Ditulis dengan Python 3.4.1 di Windows, pywin perlu diinstal.

Pengiriman golf kode pertama saya. Silakan menyarankan perbaikan

Tymric
sumber
1
Perbaiki saya jika saya salah, tetapi Anda dapat melakukan from ... import*yang menyimpan 3 byte dalam kode Anda
Eric Lagergren
1
Anda dapat menulis 274/2sebagai 137untuk menyimpan 2 karakter. Menetapkan subekspresi umum y-2*S/cke var satu huruf dan merujuknya ddan eharus menyimpan lebih banyak. The if b<X:b=int(X)pola mungkin dapat ditulis seperti b=max(b,int(X))(dan >ditulis ulang dengan min, masing-masing). Akhirnya, mungkin ada lebih banyak ruang putih untuk dimatikan, misalnya antara kbhit()dan and.
algorithmshark
1
karena Anda menggunakan beberapa fungsi lebih dari satu kali Anda harus menetapkannya ke nama yang lebih pendek G=GetSystemMetrics;x=G(0)/2;y=G(1)/2(karena resolusi selalu berupa bilangan bulat dan 2, Anda dapat menyimpan 2 garis miring), sama untuk SetCursorPos. Dan jika Anda menggunakan c = 3 **. 5 maka Anda tidak perlu mengimpor matematika
DenDenDo
1
Anda dapat menyimpan 3bytes lain dengan menggunakan map: b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c]))). Anda juga tidak memerlukan parens sekitar adan b: a,b=GetCursorPos()yang menghemat 2bytes. Anda JUGA tidak perlu menghitung ulang dan menyimpan adan b. Sederhananya perhitungan ke dalam panggilan ke S: S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))yang menyimpan 4bytes.
BeetDemGuise
1
Jika Anda tidak memerlukan perilaku hubung singkat and, Anda dapat mengganti kbhit()and ord(getch())==27dengan kbhit()*ord(getch())==27untuk menyimpan 3 karakter, karena True dilemparkan ke 1 dan False dilemparkan ke 0 dengan Python. Anda juga dapat meletakkan baris pertama dan kedua dari loop sementara pada baris yang sama, dipisahkan oleh tanda titik koma, untuk menyimpan karakter lain. Akhirnya, Anda hanya menggunakan ddan esekali masing-masing, sehingga tidak ada gunanya mendefinisikan mereka sebagai variabel. Masukkan saja Y-c*xdan Y+c*xdi lokasi yang tepat.
isaacg