Khoảng cách ngắn nhất giữa hai điểm là một đường thẳng


27

Mã hóa một chương trình hoặc chức năng để xây dựng một khung vẽ tương tác trên màn hình có kích thước tối thiểu 400 pixel x 400 pixel. Canvas có thể là bất kỳ màu nào bạn muốn, viền hoặc không viền, có hoặc không có thanh tiêu đề, v.v., chỉ là một số hình thức rõ ràng của vải.

Người dùng sẽ nhấp vào hai khu vực riêng biệt của khung vẽ và chương trình phải xuất khoảng cách Euclide (tính bằng pixel) giữa hai lần nhấp đó theo một cách thức nào đó (STDOUT, hiển thị cảnh báo, v.v.). Hai lần nhấp chuột chỉ có thể là nhấp chuột trái, chỉ nhấp chuột phải, nhấp chuột trái cho lần nhấp đầu tiên và nhấp chuột phải cho lần nhấp thứ hai, hai lần nhấp chuột trái, v.v., mọi sự kết hợp đều được chấp nhận. Lưu ý đặc biệt: Không được phép nhấp và kéo (ví dụ: sử dụng MOUSEUP làm điểm thứ hai); chúng phải là hai lần nhấp khác nhau.

Người dùng phải có khả năng làm điều này nhiều lần và phải nhận được đầu ra mỗi lần, cho đến khi chương trình bị đóng / buộc thoát / bị giết / v.v. Bạn có thể chọn phương thức đóng (nhấp vào X, ctrl-C, v.v.), bất cứ điều gì là golfier cho mã của bạn.

Quy tắc

  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Tuy nhiên, nếu một chức năng, bạn vẫn phải hiển thị đầu ra cho người dùng bằng cách nào đó (đơn giản là việc trả lại giá trị không được chấp nhận).
  • Đầu ra có thể đến bàn điều khiển, được hiển thị dưới dạng cảnh báo, được đặt trên khung vẽ, v.v.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Chúng ta có thể đưa ra kết quả chính xác (có thể chứa căn bậc hai) hay nó phải là số thập phân?
Martin Ender

@MartinEnder Hoặc / hoặc. Định dạng đầu ra không phải là phần thú vị của thử thách này.
admBorkBork

1
Giải pháp HTML / JS, từ lần nhấp thứ hai, xuất ra khoảng cách từ lần nhấp đó đến lần nhấp trước. (vì vậy nếu người dùng nhấp nlần, n-1thay vì floor(n/2)số được in) Có được phép không?
dùng202729

@ user202729 Đó là một chút bên ngoài những gì tôi đã hình dung, nhưng tôi có thể thấy nó tuân thủ các quy tắc tôi đã viết ở trên, vì vậy tôi sẽ cho phép nó.
admBorkBork

1
Chúng tôi có thể sử dụng kích thước vải nhỏ hơn nếu ngôn ngữ của chúng tôi không thể hỗ trợ canvas 400 x 400 không?
Scott Milner

Câu trả lời:


8

LOGO ( FMSLogo ), 54 52 byte

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

Thật không may, tôi không thể tìm thấy bất kỳ trình thông dịch Logo hỗ trợ trực tuyến nào xử lý chuột như FMSLogo.

Đây là "mẫu khe rõ ràng", tương tự như lambda trong các ngôn ngữ lập trình khác. Nhấp chuột trái cho điểm đầu tiên và chuột phải cho điểm thứ hai (khoảng cách in).

Giải thích: (Logo là ngôn ngữ lập trình đồ họa rùa)

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

Đây "là một từ trống rỗng. Thông thường mẫu được dự kiến ​​là một danh sách (trong đó [], một danh sách trống, không có gì), việc truyền một từ là chấp nhận được (nó được gói trong một danh sách) và trong trường hợp này, nó tiết kiệm được 2 byte.

Chạy:

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

Đây applylà một cách để chạy mẫu trong Logo, []danh sách đối số mà mẫu không nhận được.


Làm thế nào để đảm bảo vải tối thiểu 400x400?
David Mulder

1
@DavidMulder FMSLogo theo mặc định (không có dòng lệnh bổ sung) bắt đầu bằng canvas 1000 × 1000.
dùng202729

7

Toán học, 94 byte

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

Canvas là một hình ảnh tỷ lệ xám ngẫu nhiên, lần nhấp đầu tiên phải là nhấp chuột trái và lần thứ hai là nhấp chuột phải. Hành vi chính xác thực sự là nhấp chuột phải in khoảng cách đến lần nhấp cuối cùng (trái hoặc phải), vì vậy nếu bạn sử dụng nhấp chuột phải nhiều lần, bạn cũng có thể nhận được khoảng cách liên tiếp.

Các kết quả là chính xác, vì vậy chúng có thể chứa một căn bậc hai.

Nếu độ phân giải của webcam của bạn ít nhất là 400x400, bạn có thể sử dụng CurrentImage[]thay vì 1~RandomImage~400cho khung vẽ của mình, tiết kiệm 3 byte.


@Jenny_mathy Phiên bản toán học có thể? Tôi đã thử nghiệm điều này vào ngày 11.1.
Martin Ender

6

Java 8, 469 389 388 385 380 357 348 325 byte

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

Sẽ ngắn hơn với AWT, nhưng tôi chưa bao giờ sử dụng nó.


Tôi nghĩ rằng truecó thể 0<1.
Jonathan Frech

Ngoài ra, main(String args[])không thể được main(String[]Z)?
Jonathan Frech

Tôi nghĩ rằng {F f=new F();}có thể {new F();}.
Jonathan Frech

setVisible(0<1);có thể được gỡ bỏ và bạn có thể thêm .show()vào Khung; printlncó thể print.
Kevin Cruijssen

1
@KevinCruijssen Tôi không biết OP muốn đầu ra cho nhiều kết quả như thế nào
Roberto Graham

5

Java (OpenJDK 8) , 282 byte

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();}};}}

Tôi không thể kiểm tra điều này ngay bây giờ; nếu ai đó có thể cho tôi biết nếu có bất kỳ lỗi biên dịch nào sẽ là tuyệt vời.

AWT có thể sẽ ngắn hơn nhưng tôi cần một IDE thực sự cho lol đó. Tôi chưa bao giờ sử dụng AWT trước đây nhưng tôi có thể làm cho nó hoạt động nếu tôi có IDE. Tôi có thể sử dụng các tài liệu nhưng điều đó thực sự khó lol

-10 byte sử dụng AWT nhờ Kevin Cruijssen
-44 byte sử dụng khối khởi tạo; được phát triển độc lập với Roberto Graham mặc dù bây giờ tôi thấy rằng họ đã làm điều tương tự, tôi nghĩ
-6 byte kết hợp một vài khai báo nhờ Kevin
-11 byte bằng cách sử dụng interfaceKevin
-35 byte loại bỏ một số biến không cần thiết nhờ
loại bỏ mellamokb -9 byte nhập không cần thiết và sử dụng tên đủ điều kiện nhờ mellamokb
-44 byte nhờ mellamokb và aditsu


4

TI-Basic (TI-84 Plus CE), 49 byte (45 mã thông báo) (có thể không cạnh tranh)

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

-7 byte với các đề xuất từ ​​kamoroso94

Người dùng không 'nhấp' mỗi lần, nhưng di chuyển xung quanh một con trỏ trên màn hình đồ thị bằng các phím mũi tên và lần truy cập enterđể chọn một điểm và chuyển động nhỏ nhất là ~ 1,5 cho x và ~ 2,4 cho y.

Giải trình:

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
Vì kích thước chỉ phải có ít nhất 400, bạn có thể chơi golf không đổi với giá trị lớn hơn 400 nhưng ít hơn một byte.
kamoroso94

1
Ngoài ra, bạn có thể giảm Dispdòng bằng hai byte với {X-A,Y-B:Disp √(sum(Ans²(dấu hai chấm hoặc dòng mới hoạt động rõ ràng).
kamoroso94

@ kamoroso94 TI-BASIC của tôi bị gỉ nhưng sẽ không có 8^2cùng số byte?
Todd Sewell

@ToddSewell no, 8^2(8 bình phương) là 64 và nhỏ hơn 400. Tôi đã nói (8 khối) lớn hơn 400 và sử dụng hai mã thông báo, mỗi byte một: 8³.
kamoroso94

1
@ToddSewell: Chắc chắn là có (MATH → 3).
Nick Matteo

4

JavaScript (ES6) + HTML, 58 byte

Các trang web chính nó phục vụ như "bức tranh" trong câu hỏi; Tôi nghĩ khá an toàn khi giả sử cửa sổ trình duyệt sẽ có ít nhất 400x400 pixel.

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


JavaScript (ES6) + HTML, 51 byte

Chúng ta có thể lưu 7 byte nếu bỏ qua NaNđầu ra ở lần nhấp đầu tiên. ( @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 byte

Chỉnh sửa : Với thêm 13 byte CSS, chúng tôi có thể đảm bảo vùng cuộn sẽ đủ lớn để phù hợp với yêu cầu 400x400.

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


2

Đang xử lý / Java, 149 byte

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

Khá đơn giản, sử dụng 2 biến toàn cục và 3 hàm tích hợp để làm mọi thứ.

  • Thiết lập: chỉ cần khởi tạo cửa sổ tới 400x400
  • Vẽ: trống, nhưng phải tồn tại để Xử lý được tương tác cho> 1 khung
  • MousePress: nếu nhấp chuột trái, lưu tọa độ chuột vào số nguyên a và b. Nếu nhấp chuột phải, đo khoảng cách từ điểm (a, b) đến vị trí hiện tại và in ra bàn điều khiển.

2

Chế biến.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

Trăn 2, 144

In khoảng cách giữa các lần nhấp cuối cùng (lần đầu tiên in khoảng cách từ 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

Autohotkey, 146 byte

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

Bạn sẽ nghĩ rằng một ngôn ngữ được xây dựng dành riêng để chụp và mô phỏng các hành động bàn phím và chuột sẽ hiệu quả hơn ở thử thách này ...

Điều này tạo ra một cửa sổ với hộp văn bản 400 x 400 pixel có viền để làm cho nó rõ ràng. Không có đường viền, sẽ có một khoảng trống xung quanh cạnh trong cửa sổ nhưng bên ngoài hộp văn bản và bạn không thể biết được. Thêm một đường viền là cách ngắn nhất để phân biệt chúng. Các gCtùy chọn làm cho nó chạy chương trình con Cbất cứ khi nào bạn nhấn chuột vào hộp văn bản. Do đó, chuỗi lệnh là Nhấp chuột trái theo sau là Nhấp chuột trái khác.

Tôi đã tìm thấy một giải pháp khác đó là 144 byte nhưng nó cho phép nhấp chuột trên toàn màn hình thay vì chỉ trong "khung vẽ rõ ràng". Nó cũng gây khó chịu khi kết thúc vì cả nhấp chuột trái và phải đều bị bắt và nó không kết thúc khi bạn đóng 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 byte

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 đi kèm với kích thước mặc định là vải bạt có kích thước (800x, 600y).

Điều này sinh ra một hình ảnh rùa tạm thời cho mỗi điểm 'bắt đầu' được nhấp, sẽ biến mất sau khi điểm 'bắt đầu' tiếp theo được chọn. Hành vi này được OP chấp thuận.


0

SmileBASIC, 86 byte

@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

Sử dụng màn hình cảm ứng cho đầu vào.


0

Java 8, 228 byte

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();}}

Đây là một giải pháp Java sử dụng phương thức AWT không dùng nữa mouseDownmà bạn phải tìm hiểu sâu về API để tìm. Tôi chỉ biết điều đó vì khóa học lập trình mà tôi đã học khi còn là học sinh trung học, và một trong những dự án là thực hiện một chương trình vẽ nhỏ bằng cách đó và các phương pháp tương tự. Tôi chưa bao giờ nghĩ rằng tôi có một lý do tốt để sử dụng nó cho đến bây giờ.


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}

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

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.