マウスを捕まえろ!


8

可能な限り短いプログラムを作成し、一辺の長さが274ピクセルで画面の真ん中に重心がある上向きの正三角形の中にマウスカーソルを閉じ込めます。
(チーズウェッジのために三角形。)

プログラムの実行中は、カーソルの先端がこの三角形の外に移動することはできず、内部で正常に移動して機能するはずです。ときにEscキーがヒットしたプログラムは、マウスを解放し、終了する必要があります。

得点

これはcode-golfで、バイト単位の最短コードが優先されます。標準のASCIIのみを使用できます。

細部

  • コンピュータの電源を切る、プロセスを強制終了する、またはを押すAlt-F4などのCtrl-Alt-Deleteほかに、カーソルを解放する唯一の方法はEscキーでなければなりません。
  • プログラムの開始時にカーソルが三角形の外側にある場合は、カーソルをどこかに配置する必要があります。
  • カーソルは、三角形の斜めの2辺をスムーズに上下に移動できる必要があります。
  • ディスプレイが複数のモニターにまたがっている場合、三角形はいずれか1つのモニターの中央またはすべてのモニターの組み合わせの中央に表示されます。(モニターが1つしかない場合は、これをテストする必要はありません。)
  • タッチスクリーンユーザーが三角形の外側をクリックしても問題ない。

小さなボーナス質問: 274はどこで手に入りましたか?


小さなボーナスの答え:辺の長さは三角形の領域を2 ^ 15ピクセルに収めるために選択されましたか
— Egor Skriptunoff 2014

3
Tiniボーナス回答:おそらくen.wikipedia.org/wiki/Centered_triangular_number / oeis.org/A005448が原因ですか?
— flawr

@EgorSkriptunoffとflawr Nope。
— Calvin's Hobbies 14

三角形の傾斜した側面に沿って274ピクセルをどのように測定しますか?各ピクセルは正方形であるため、274ピクセルをカウントすると、二等辺三角形が生成されます。この二等辺三角形の上面は、底辺よりsqrt(2)倍長くなっています
— Tymric

1
@Timmy三角形のピークは、ベースの2つの端点からユークリッド距離で274ピクセルを測定する必要があります。丸め誤差によってこれが不完全になっても問題ありません。
— Calvin's Hobbies 14

回答:


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

組み込みの最小/最大関数がないため、72文字をかけて再実装しました。

押しtてカーソルをトラップします。ホットキーに割り当てずに操作できるかどうかはわかりません。

マウスをゆっくり動かさない限り、動きはあまりスムーズではありません

ここに画像の説明を入力してください


2

パイソン418 351 314 300 263のバイト

編集:保存67 104 118 155バイトコメントのアドバイスのおかげで

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

WindowsのPython 3.4.1で記述されているため、pywinをインストールする必要があります。

私の最初のコードゴルフの提出。改善を提案してお気軽に


1
私が間違っている場合は修正してください。ただしfrom ... import*、コードで3バイト節約できます
— Eric Lagergren

1
あなたは書くことができます274/2として1372つの文字を保存します。共通の部分式y-2*S/cを1文字のvarに割り当て、それを参照すると、dさらにe節約できるはずです。if b<X:b=int(X)パターンは、おそらくのように書くことができるb=max(b,int(X))(そして>、それぞれ分に書き換え)。最後に、おそらくkbhit()との間など、絞り出す余白がおそらくさらにあるでしょうand。
— algorithmhark

1
一部の関数を使用しているため、短い名前にそれらを割り当てる必要がありますG=GetSystemMetrics;x=G(0)/2;y=G(1)/2(解像度は常に整数で2の倍数なので、2つのスラッシュを保存できます)。これは、SetCursorPosと同じです。そして、c = 3 **。5を使用する場合、数学をインポートする必要はありません
— DenDenDo

1
あなたは使用して別の3バイトを保存することができますmap:b=min(max(b,*map(int,[c*a+d,-c*a+e,y+s/c])))。また、周りに括弧を必要としないaとb:a,b=GetCursorPos()2バイトを保存します。あなたはまた、再計算して保存する必要はありませんaとb。計算を呼び出して、S:S((min(max(a,x-s),x+s),min(max(b,int(c*a+d),int(-c*a+e)),int(y+s/c))))を4バイト節約します。
— BeetDemGuise 2014

1
PythonのTrueは1にキャストされ、Falseは0にキャストされるためand、の短絡動作が必要ない場合は、で置き換えkbhit()and ord(getch())==27てkbhit()*ord(getch())==273文字を保存できます。また、whileループの1行目と2行目を同じ行にセミコロンで区切って配置して、別の文字を保存することもできます。最後に、使用するのはdとeをそれぞれ1回だけにするため、それらを変数として定義しても意味がありません。ただ置くY-c*xとY+c*x、適切な場所インチ
— isaacg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.