2点間の最短距離は線です


27

プログラムまたは関数をコーディングして、画面上に少なくとも400ピクセルx 400ピクセルのサイズのインタラクティブキャンバスを構築します。キャンバスは、タイトルバーの有無にかかわらず、境界線のあるまたは境界線のない任意の色にすることができます。

ユーザーはキャンバスの2つの異なる領域をクリックし、プログラムはそれら2つのクリック間のユークリッド距離(ピクセル単位)を何らかの方法(STDOUT、アラートの表示など)で出力する必要があります。2回のクリックは、左クリックのみ、右クリックのみ、1回目は左クリック、2回目は右クリック、2回のダブル左クリックなど、任意の組み合わせが可能です。特記事項:クリックアンドドラッグ(たとえば、2番目のポイントとしてMOUSEUPを使用)は特に許可されていません。2回のクリックが必要です。

ユーザーはこれを複数回実行できる必要があり、プログラムが終了/強制終了/強制終了などされるまで、毎回出力を取得する必要があります。コードのゴルファーが何であれ、クロージャの方法を選択できます(X、ctrl-Cなどをクリックします)。

ルール

  • 完全なプログラムまたは機能のいずれかが受け入れられます。ただし、関数の場合は、何らかの方法でユーザーに出力を表示する必要があります(単に値を返すことは受け入れられません)。
  • 出力は、コンソールへの出力、アラートとしての表示、キャンバスへの入力などが可能です。
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

正確な結果(平方根を含む場合があります)を出力できますか、それとも小数でなければなりませんか?
マーティンエンダー

@MartinEnderどちらかまたは両方。出力の書式設定は、この課題の興味深い部分ではありません。
AdmBorkBork

1
HTML / JSソリューションは、2回目のクリックから、そのクリックから前のクリックまでの距離を出力します。(つまり、ユーザーがクリックした場合、数字の代わりにn時間が印刷されます)それは許可されていますか?n-1floor(n/2)
user202729

@ user202729それは私が想定していたものとは少し異なりますが、上で書いたルールにどのように準拠しているかを見ることができますので、許可します。
AdmBorkBork

1
言語が400 x 400のキャンバスをサポートできない場合、より小さいキャンバスサイズを使用できますか?
スコットミルナー

回答:


8

ロゴ(FMSLogo)、54 52バイト

[mouseon[setpos mousepos]"[pr distance mousepos]"[]]

残念ながら、FMSLogoのようなマウスハンドリングをサポートするロゴインタープリターがオンラインで見つかりません。

これは「明示的なスロットテンプレート」であり、他のプログラミング言語のラムダに似ています。最初のポイントで左マウスをクリックし、2番目のポイントで右マウスをクリックします(印刷距離)。

説明:(ロゴはタートルグラフィックプログラミング言語です)

mouseon                  Turn on mouse handling, with the following action:
[setpos mousepos]        Set the turtle to `mousepos` (the position of the mouse) on left mouse down
"                        Do nothing on left mouse up
[pr distance mousepos]   Print the distance from turtle position (`distance` is Logo builtin for that purpose) to `mousepos` on right mouse down
"                        Do nothing on right mouse up
[]                       Do nothing on mouse movement

"空の言葉です。通常、テンプレートはリスト(ここ[]で、空のリスト、何もしない)であることが期待され、単語を渡すことは許容され(リストにラップされます)、この場合は2バイトを節約します。

実行:

apply [... <put the code here> ...] []

これapplyは、ロゴでテンプレートを実行する1つの方法[]であり、引数リストです。テンプレートは何も受け取りません。


これにより、最小400x400キャンバスがどのように保証されますか?
デビッドモルダー

1
@DavidMulder FMSLogoはデフォルトで(追加のコマンドラインなしで)キャンバス1000×1000で始まります。
user202729

7

Mathematica、94バイト

e="MouseDown";m:=x=MousePosition[];1~RandomImage~400~EventHandler~{e:>m,{e,2}:>Echo@Norm[x-m]}

キャンバスはランダムなグレースケール画像であり、最初のクリックは左クリック、2番目のクリックは右クリックである必要があります。正確な動作は、実際には右クリックで最後のクリックまでの距離(左または右)が印刷されるため、右クリックを繰り返し使用すると、連続した距離を取得することもできます。

結果は正確であるため、平方根が含まれる場合があります。

ウェブカメラの解像度が少なくとも400x400であれば、キャンバスのCurrentImage[]代わりに1~RandomImage~4003バイトを節約できます。


@Jenny_mathy Mathematicaバージョンかもしれない?これを11.1でテストしました。
マーティンエンダー

6

Java 8、469 389 388 385 380 357 348 325バイト

import java.awt.event.*;interface F{static void main(String[]a){new java.awt.Frame(){{setSize(400,400);double[]a={-1,0};addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){if(a[0]<0){a[0]=e.getX();a[1]=e.getY();}else{System.out.println(Math.hypot(e.getX()-a[0],e.getY()-a[1]));a[0]=-1;}}});}}.show();}}

import javafx.application.*;import javafx.scene.*;import javafx.scene.layout.*;import javafx.stage.*;public class E extends Application{double[]a={-1,0};public void start(Stage s)throws Exception{Pane p=new Pane();s.setScene(new Scene(p,400,400));s.show();p.setOnMouseClicked(e->{if(a[0]<0){a[0]=e.getX();a[1]=e.getY();}else {System.out.println(Math.sqrt(Math.pow(e.getX()-a[0],2)+Math.pow(e.getY()-a[1],2)));a[0]=-1;}});}public static void main(String[]a){launch(a);}}

AWTでは短くなりますが、使用したことはありません。


true可能性があると思います0<1
ジョナサンフレッチ

また、することmain(String args[])はできませんmain(String[]Z)か?
ジョナサンフレッチ

{F f=new F();}できると思います{new F();}
ジョナサンフレッチ

setVisible(0<1);削除でき.show()、フレームに追加できます。printlnすることができますprint
ケビンCruijssen

1
私はOPが複数の結果の出力望んでいるのか分からない@KevinCruijssen
ロベルト・グラハム

5

Java(OpenJDK 8)、282バイト

import java.awt.event.*;interface M{static void main(String[]a){new java.awt.Frame(){int k,x,y;{addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){x=e.getX()-k*x;y=e.getY()-k*y;k^=1;if(k<1)System.out.prin‌​tln(Math.hypot(x,y))‌​;}});setSize(800,600‌​);show();}};}}

私は今これをテストできません。コンパイラエラーがあればすばらしいと誰かが教えてくれたら。

AWTはおそらく短くなりますが、そのためには実際のIDEが必要です。私は以前にAWTを使用したことはありませんが、IDEがあれば機能させることができました。私はドキュメントを使用できますが、それは本当に難しいです笑

Kevin CruijssenのおかげでAWTを使用して-10バイト-
初期化ブロックを使用して-44バイト。Roberto Grahamとは独立して開発されましたが、同じことが行われていることが わかりました。Kevin- 11バイトの
おかげでいくつかの宣言を組み合わせて-6バイト、Kevin
interfaceおかげで
-35バイト、mellamokb
-9バイトの削除で不要な変数を排除不要なインポートと、mellamokbの修飾名の使用
-mellamokbとaditsuのおかげで-44バイト


4

TI-Basic(TI-84 Plus CE)、49バイト(45トークン)(競合しない可能性があります)

0→Xmin
0→Ymin
8³→Xmax
Ans→Ymax
While 1
Input 
{X,Y
Input 
Ans-{X,Y
Disp √(sum(Ans²
Pause
End

kamoroso94からの提案を含む-7バイト

ユーザーはそれ自体「クリック」するのではなく、矢印キーを押してグラフ画面上のカーソルの周りを移動enterしてポイントを選択し、最小の移動はxで〜1.5、yで〜2.4です。

説明:

0→Xmin                # 5 bytes
0→Ymin                # 5 bytes
8³→Xmax               # 6 bytes, 
Ans→Ymax              # 5 bytes, Set up graph screen size (512x512)
While 1               # 3 bytes, Until interrupted with `on` button
Input                 # 2 bytes, Get user input as a point on the graph screen in X and Y
{X,Y                  # 5 bytes, store the list {X,Y} in Ans
Input                 # 2 bytes, Get second user input as a point on the graph screen in X and Y
Ans-{X,Y              # 7 bytes, store {X1-X2,Y1-Y2} in Ans
Disp √(sum(Ans²       # 6 bytes, Display the distance between the two points
Pause                 # 2 bytes, Let the user see it (press `enter` to continue)
End                   # 1 bytes, End while loop

1
サイズは少なくとも400である必要があるため、その定数を400より大きく1バイト少なくすることができます。
kamoroso94

1
また、Disp行を2バイト減らすことができ{X-A,Y-B:Disp √(sum(Ans²ます(コロンまたは改行は明らかに機能します)。
kamoroso94

@ kamoroso94私のTI-BASICは錆びています8^2が、同じバイト数ではないでしょうか?
トッドシーウェル

@ToddSewellいいえ、8^2(8の2乗)は64で400未満です。私は(8の3乗)と言いました。これは400より大きく、2つのトークンを使用8³ます。
kamoroso94

1
@ToddSewell:確かにあります(MATH→3)。
ニックマッテオ

4

JavaScript(ES6)+ HTML、58バイト

Webページ自体が問題の「キャンバス」として機能します。ブラウザウィンドウが少なくとも400x400ピクセルになると想定するのは非常に安全だと思います。

E=0,onclick=e=>(E&&alert(Math.hypot(E.x-e.x,E.y-e.y)),E=e)


JavaScript(ES6)+ HTML、51バイト

NaN最初のクリックで出力を無視すると、7バイト節約できます。(@Nate

E=onclick=e=>alert(Math.hypot(E.x-e.x,E.y-e.y),E=e)


JavaScript(ES6)+ HTML + CSS、58 + 0 + 13 = 71バイト

編集:CSSをさらに13バイト追加することで、スクロール領域が400x400の要件を満たすのに十分な大きさになることを保証できます。

E=0,onclick=e=>(E&&alert(Math.hypot(E.x-e.x,E.y-e.y)),E=e)
*{padding:9in


2

/ Javaの処理、149バイト

void setup(){size(400,400);}void draw(){}int a,b;void mousePressed(){if(mouseButton==LEFT){a=mouseX;b=mouseY;}else println(dist(a,b,mouseX,mouseY));}

2つのグローバル変数と3つの組み込み関数を使用してすべてを実行します。

  • セットアップ:ウィンドウを400x400に初期化するだけです
  • 描画:空ですが、Processingが1フレーム以上インタラクティブになるために存在する必要があります
  • MousePressed:左クリックした場合、マウス座標を整数aおよびbに保存します。右クリックした場合、ポイント(a、b)から現在の位置までの距離を測定し、コンソールに出力します。

2

Processing.org 126

float i,d,x,y;void setup(){fullScreen();}void draw(){}void mousePressed(){d=dist(x,y,x=mouseX,y=mouseY);print(i++%2<1?" ":d);}

1

Python 2、144

最後のクリック間の距離を印刷します(最初のクリックは400,400からの距離を印刷します)。

import Tkinter as t,math
r=t.Tk()
p=[400]*2
r.minsize(*p)
def f(e):print math.hypot(p[0]-e.x,p[1]-e.y);p[:]=e.x,e.y
r.bind('<1>',f)
r.mainloop()

0

オートホットキー、146バイト

A=0
Gui,Add,Text,W400 H400 gC Border
Gui,Show
Return
C:
If A=0
MouseGetPos,A,B
Else{
MouseGetPos,C,D
Msgbox % Sqrt((A-C)**2+(B-D)**2)
A=0
}
Return

キーボードとマウスの動作をキャプチャしてシミュレートするために特別に構築された言語は、この課題でより効率的だと思います...

これにより、400 x 400ピクセルのテキストボックスが枠付きで表示され、わかりやすくなります。境界線がない場合、ウィンドウの内側であるがテキストボックスの外側にあるエッジの周囲にスペースがあり、わかりません。境界線を追加することは、それらを区別する最短の方法でした。このgCオプションによりC、テキストボックスをクリックするたびにサブルーチンが実行されます。したがって、コマンドシーケンスは、左クリックの後に別の左クリックが続きます。

144バイトの別のソリューションを見つけましたが、「明白なキャンバス」ではなく、画面全体でクリックできるようにします。また、左クリックと右クリックの両方がキャプチャされ、GUIを閉じても終了しないため、終了するのは面倒です。

Gui,Add,Text,W400 H400 Border
Gui,Show
Return
LButton::
MouseGetPos,A,B
Return
RButton::
MouseGetPos,C,D
Msgbox % Sqrt((A-C)**2+(B-D)**2)
Return

0

Python 2(TigerJython)、125 123バイト

from gturtle import*
n=0
def c(x,y):
 global n
 if n:print distance(x,y)
 else:setPos(x,y)
 n^=1
makeTurtle(mousePressed=c)

TigerJythonには、デフォルトサイズの(800x、600y)サイズのキャンバスが付属しています。

これにより、クリックされた「開始」ポイントごとに一時的なタートル画像が生成され、次の「開始」ポイントが選択されると消えます。この動作はOPによって承認されています。


0

SmileBASIC、86バイト

@L
TOUCH OUT F,X,Y
S=S-X
T=T-Y
IF!O*F*M THEN?SQR(S*S+T*T)
S=X
T=Y
M=M!=!O*F
O=F
GOTO@L

入力にタッチスクリーンを使用します。


0

Java 8、228バイト

interface A{static void main(String[]a){new java.awt.Frame(){{setSize(400,400);}int i,j,t;public boolean mouseDown(java.awt.Event e,int x,int y){if(t++%2==1)System.out.println(Math.hypot(x-i,y-j));i=x;j=y;return 1>0;}}.show();}}

以下に、非推奨のAWTメソッドを使用するJavaソリューションをmouseDown示します。これらのメソッドは、APIを掘り下げて検索する必要があります。私は高校2年生として受講したプログラミングコースのためにそれを知っているだけで、プロジェクトの1つは、それと同様の方法を使用して小さなペイントプログラムを作成することでした。今までそれを使う正当な理由があるとは思っていませんでした。


0

Tcl / Tk、94 104

wm ge . 400x400
bind . <1> {if [info ex x] {puts [expr hypot(%x-$x,%y-$y)]}
set x %x
set y %y}

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.