Bẫy chuột!


8

Viết chương trình ngắn nhất có thể bẫy con trỏ chuột bên trong một tam giác đều cạnh hướng lên trên với chiều dài cạnh là 274 pixel và một tâm ở giữa chính xác của màn hình.
(Tam giác vì nêm phô mai.)

Trong khi chương trình của bạn đang chạy, đầu con trỏ sẽ không bao giờ có thể di chuyển ra ngoài tam giác này, và nên di chuyển và hoạt động bình thường bên trong. Khi Escnhấn phím, chương trình phải kết thúc, nhả chuột.

Chấm điểm

Đây là code-golf, mã ngắn nhất tính bằng byte thắng. Bạn chỉ có thể sử dụng ASCII tiêu chuẩn.

Chi tiết

  • Bên cạnh những thứ như tắt máy tính hoặc giết tiến trình hoặc nhấn Alt-F4hoặc Ctrl-Alt-Delete, cách duy nhất để nhả con trỏ phải là Escchìa khóa.
  • Nếu con trỏ nằm ngoài tam giác khi chương trình khởi động thì nên đặt nó ở đâu đó bên trong.
  • Con trỏ phải có khả năng di chuyển trơn tru lên xuống hai cạnh của các hình tam giác.
  • Nếu màn hình được mở rộng trên nhiều màn hình, tam giác có thể xuất hiện ở trung tâm của bất kỳ một màn hình nào hoặc trung tâm của tất cả các màn hình được kết hợp. (Nếu bạn chỉ có một màn hình, bạn không cần phải kiểm tra điều này.)
  • Sẽ ổn nếu người dùng màn hình cảm ứng vẫn có thể nhấp vào những thứ bên ngoài tam giác.

Câu hỏi thưởng nhỏ: Tôi đã nhận được 274 từ đâu?


Câu trả lời phần thưởng nhỏ: chiều dài cạnh đã được chọn để phù hợp với diện tích tam giác thành 2 ^ 15 pixel?
Egor Skriptunoff

3
Tini phần thưởng trả lời: Có lẽ vì en.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448?
flawr

@EgorSkriptunoff và flawr Không.
Sở thích của Calvin

Làm thế nào để bạn đo được 274 pixel dọc theo các cạnh của tam giác? Vì mỗi pixel là một hình vuông, việc đếm 274 pixel sẽ dẫn đến một tam giác cân có cạnh trên dài hơn cơ sở theo hệ số sqrt (2)
Tymric

1
@Timmy Đỉnh tam giác sẽ đo được 274 pixel trong khoảng cách Euclide từ hai điểm cuối của cơ sở. Sẽ ổn nếu lỗi làm tròn không hoàn hảo.
Sở thích của Calvin

Câu trả lời:


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

Nó không có chức năng tối thiểu / tối đa, vì vậy tôi đã dành 72 ký tự để thực hiện chúng.

Nhấn tđể bẫy con trỏ, tôi không biết có thể làm công cụ mà không gán nó cho một phím nóng hay không.

Chuyển động không được mượt mà, trừ khi bạn di chuyển chuột chậm

nhập mô tả hình ảnh ở đây


2

Python 418 351 314 300 263 byte

Chỉnh sửa: Đã lưu 67 104 118 155 Byte nhờ lời khuyên trong các nhận xét

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

Được viết bằng Python 3.4.1 trên Windows, pywin cần được cài đặt.

Mã trình golf đầu tiên của tôi. Xin vui lòng đề xuất cải tiến


1
Sửa lỗi cho tôi nếu tôi sai, nhưng bạn có thể làm điều from ... import*đó giúp tiết kiệm 3 byte trong mã của bạn
Eric Lagergren

1
Bạn có thể viết 274/2như 137để lưu 2 ký tự. Chỉ định biểu thức con chung y-2*S/ccho var một chữ cái và tham chiếu nó trong denên tiết kiệm thêm một số. Các if b<X:b=int(X)mô hình có lẽ có thể được viết như thế b=max(b,int(X))(và >viết lại với phút, tương ứng). Cuối cùng, có lẽ có thêm một số khoảng trắng để vắt kiệt, ví dụ giữa kbhit()and.
thuật toán

1
vì bạn đang sử dụng một số hàm nhiều hơn nên một khi bạn nên gán chúng cho một tên ngắn hơn G=GetSystemMetrics;x=G(0)/2;y=G(1)/2(vì độ phân giải luôn là số nguyên và bội số của 2 bạn có thể lưu 2 dấu gạch chéo), tương tự cho SetC bổngPos. Và nếu bạn sử dụng c = 3 **. 5 thì bạn không cần phải nhập toán
DenDenDo

1
Bạn có thể tiết kiệm thêm 3byte bằng cách sử dụng map: b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c]))). Bạn cũng không cần các parens xung quanh ab: a,b=GetCursorPos()giúp tiết kiệm 2byte. Bạn cũng không cần phải tính toán lại và lưu trữ ab. Đơn giản chỉ cần đặt các tính toán vào cuộc gọi đến S: S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))giúp tiết kiệm 4byte.
BeetDemGuise

1
Nếu bạn không cần hành vi ngắn mạch của and, bạn có thể thay thế kbhit()and ord(getch())==27bằng kbhit()*ord(getch())==27để lưu 3 ký tự, vì True được chuyển thành 1 và Sai được chuyển thành 0 trong Python. Ngoài ra, bạn có thể đặt các dòng đầu tiên và thứ hai của vòng lặp while trên cùng một dòng, được phân tách bằng dấu chấm phẩy, để lưu một ký tự khác. Cuối cùng, bạn chỉ sử dụng demỗi lần một lần, vì vậy không có điểm nào trong việc xác định chúng là biến. Chỉ cần đặt Y-c*xY+c*xở những vị trí thích hợp.
isaacg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.