두 점 사이의 최단 거리는 선입니다


27

화면에 최소 400 픽셀 x 400 픽셀 크기의 대화식 캔버스를 구성하는 프로그램 또는 함수를 코딩하십시오. 캔버스는 제목 표시 줄 등이 있거나없는 경계가 있거나 경계가없는 모든 색상 일 수 있습니다.

사용자는 캔버스에서 두 개의 개별 영역을 클릭하고 프로그램은 두 가지 클릭 사이의 유클리드 거리 (픽셀)를 일정한 방식으로 출력해야합니다 (STDOUT, 경고 표시 등). 두 번의 클릭은 왼쪽 클릭 만, 오른쪽 클릭 만, 두 번째 클릭은 첫 번째와 오른쪽 클릭을위한 왼쪽 클릭, 두 번 두 번 왼쪽 클릭을 할 수 있습니다. 특별 참고 사항 : 클릭 앤 드래그 (예 : MOUSEUP를 두 번째 포인트로 사용)는 구체적으로 허용되지 않습니다. 두 번 클릭해야합니다.

사용자는이 작업을 여러 번 수행 할 수 있어야하며 프로그램이 종료 / 강제 종료 / 종료 / 기회 될 때까지 매번 출력을 가져와야합니다. 코드의 골퍼가 무엇이든 클로저 방법 (X, ctrl-C 등 클릭)을 선택할 수 있습니다.

규칙

  • 전체 프로그램 또는 기능이 허용됩니다. 그러나 함수 인 경우 어떻게 든 사용자에게 출력을 표시해야합니다 (간단히 값을 반환하는 것은 허용되지 않습니다).
  • 출력은 콘솔로, 경고로 표시되고, 캔버스에 채워질 수 있습니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

정확한 결과 (제곱근을 포함 할 수 있음)를 출력 할 수 있습니까 아니면 소수 여야합니까?
마틴 엔더

@MartinEnder 또는. 출력 형식은이 도전에서 흥미로운 부분이 아닙니다.
AdmBorkBork

1
두 번째 클릭에서 HTML / JS 솔루션은 해당 클릭에서 이전 클릭까지의 거리를 출력합니다. (따라서 사용자가 n시간을 클릭하면 숫자 n-1대신 floor(n/2)인쇄됩니다) 허용됩니까?
user202729 2016

@ user202729 그것은 내가 구상했던 것의 약간 벗어 났지만, 그것이 내가 작성한 규칙을 어떻게 준수하는지 알 수 있으므로 허용하겠습니다.
AdmBorkBork

1
언어가 400 x 400 캔버스를 지원할 수없는 경우 더 작은 캔버스 크기를 사용할 수 있습니까?
Scott Milner 17

답변:


8

로고 ( FMSLogo ), 54 52 바이트

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

불행히도 FMSLogo와 같은 Logo 인터프리터 온라인 지원 마우스 처리를 찾을 수 없습니다.

이것은 "명시 적 슬롯 템플릿"이며 다른 프로그래밍 언어의 람다와 유사합니다. 첫 번째 점의 경우 왼쪽 마우스를 클릭하고 두 번째 점의 경우 오른쪽 마우스를 클릭하십시오 (인쇄 거리).

설명 : (로고는 거북이 그래픽 프로그래밍 언어입니다)

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> ...] []

이것은 applyLogo에서 템플릿을 실행하는 한 가지 방법이며, 템플릿 []은 인수를받지 않는 인수 목록입니다.


이것이 최소 400x400 캔버스를 어떻게 보장합니까?
David Mulder

1
@DavidMulder FMSLogo는 기본적으로 (추가 명령 줄없이) canvas 1000 × 1000으로 시작합니다.
user202729

7

수학, 94 바이트

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

캔버스는 임의의 회색조 이미지이며, 첫 번째 클릭은 왼쪽 클릭이고 두 번째 클릭은 오른쪽 클릭이어야합니다. 정확한 동작은 실제로 오른쪽 클릭이 마지막 클릭까지의 거리 (왼쪽 또는 오른쪽)를 인쇄하므로 마우스 오른쪽 버튼을 반복해서 사용하면 연속 거리를 얻을 수도 있습니다.

결과는 정확하므로 제곱근을 포함 할 수 있습니다.

웹캠의 해상도가 400x400 이상이면 캔버스 CurrentImage[]대신 사용할 수 있으며 1~RandomImage~4003 바이트를 절약 할 수 있습니다 .


@Jenny_mathy Mathematica 버전 어쩌면? 나는 이것을 11.1에서 테스트했다.
마틴 엔더

6

자바 (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.
Jonathan Frech

또한 수 main(String args[])없습니다 main(String[]Z)?
Jonathan Frech

나는 {F f=new F();}될 수 있다고 생각 한다 {new F();}.
Jonathan Frech

setVisible(0<1);제거 할 수 있으며 .show()프레임에 추가 할 수 있습니다 . println일 수 있습니다 print.
Kevin Cruijssen

1
나는 영업 이익은 복수의 결과에 대한 출력 원하는 방법을 모르는 @KevinCruijssen
로베르토 그레이엄

5

자바 (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는 아마도 더 짧을 것이지만 그 lol에 대한 실제 IDE가 필요합니다. 전에는 AWT를 사용한 적이 없지만 IDE가 있으면 작동시킬 수 있습니다. 나는 문서를 사용할 수는 있지만 정말 어렵다.


이니셜 라이저 블록을 사용하는 Kevin Cruijssen 덕분에 AWT를 사용하는 -10 바이트 ; Roberto Graham과 독립적으로 개발되었지만 이제는 동일한 작업을 수행 한 것으로 보았습니다.
Kevin
-11 바이트는 mellamokb -9 바이트 제거 덕분에 불필요한 변수를 제거 interface하는 Kevin
-35 바이트 덕분에 -11 바이트 덕분에 몇 가지 선언을 결합 한다고 생각합니다 mellamokb 및 aditsu
덕분에 mellamokb
-44 바이트 덕분에 불필요한 가져 오기 및 정규화 된 이름 사용


4

TI 기본 (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 18

@ kamoroso94 TI-BASIC이 녹슨 8^2데 같은 바이트 수입니까?
토드 세웰

@ToddSewell 없음, 8^2(8 제곱) 64 미만 400 I를 말한다 : 400 이상이고 두 토큰이 각 바이트의 하나의 사용 (8 제곱) 8³.
kamoroso94

1
@ToddSewell : 확실히 (MATH → 3) 있습니다.
Nick Matteo

4

자바 스크립트 (ES6) + HTML, 58 바이트

웹 페이지 자체는 문제의 "캔버스"역할을합니다. 브라우저 창이 400x400 픽셀 이상이라고 가정하는 것이 안전하다고 생각합니다.

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


자바 스크립트 (ES6) + HTML, 51 바이트

NaN첫 번째 클릭 에서 출력을 무시하면 7 바이트를 절약 할 수 있습니다 . ( @ 네이트 )

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


자바 스크립트 (ES6) + HTML + CSS, 58 + 0 + 13 = 71 바이트

편집 : 추가 13 바이트의 CSS를 사용하면 스크롤 영역이 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으로 초기화합니다.
  • 그리기 : 비어 있지만 처리가 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

파이썬 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

파이썬 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

자바 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 학년으로 수강 한 프로그래밍 과정 때문에 그것을 알고 있으며, 그 중 하나는 그와 비슷한 방법을 사용하여 작은 페인트 프로그램을 만드는 것이 었습니다. 나는 지금까지 그것을 사용해야 할 좋은 이유가 있다고 생각하지 않았습니다.


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.