Najkrótsza odległość między dwoma punktami to linia


27

Kod programu lub funkcji, aby zbudować interaktywne płótno na ekranie o wielkości co najmniej 400 pikseli x 400 pikseli. Płótno może być dowolnego koloru, graniczy lub bez obramowania, z paskiem tytułowym lub bez, itp., Po prostu jakąś formę oczywistego płótna.

Użytkownik kliknie dwa odrębne obszary płótna, a program musi w pewien sposób wyprowadzić odległość euklidesową (w pikselach) między tymi dwoma kliknięciami (STDOUT, wyświetlanie alertu itp.). Dwa kliknięcia mogą być tylko kliknięciami lewym, tylko prawym kliknięciem, lewym kliknięciem dla pierwszego i prawym kliknięciem dla drugiego, dwoma podwójnymi kliknięciami lewym itd., Dowolna kombinacja jest dopuszczalna. Uwaga specjalna: Klikanie i przeciąganie (np. Używanie MOUSEUP jako drugiego punktu) jest szczególnie zabronione; muszą to być dwa różne kliknięcia.

Użytkownik musi być w stanie to zrobić wiele razy i za każdym razem musi uzyskać wynik, dopóki program nie zostanie zamknięty / force-quit / kill / etc. Możesz wybrać metodę zamknięcia (kliknięcie X, Ctrl-C itp.), Cokolwiek jest bardziej golfowe dla twojego kodu.

Zasady

  • Dopuszczalny jest pełny program lub funkcja. Jeśli jednak funkcja musi nadal wyświetlać dane wyjściowe użytkownikowi (zwykłe zwrócenie wartości jest niedopuszczalne).
  • Dane wyjściowe mogą być wysyłane do konsoli, wyświetlane jako alert, umieszczane na kanwie itp.
  • Standardowe luki są zabronione.
  • To jest więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).

Czy możemy podać dokładne wyniki (które mogą zawierać pierwiastki kwadratowe), czy też muszą to być liczby dziesiętne?
Martin Ender

@MartinEnder Albo / lub. Formatowanie wyjściowe nie jest interesującą częścią tego wyzwania.
AdmBorkBork

1
Rozwiązanie HTML / JS, od drugiego kliknięcia, wyświetla odległość od tego kliknięcia do poprzedniego kliknięcia. (więc jeśli użytkownik kliknie nrazy, n-1zamiast floor(n/2)liczb są drukowane) Czy to dozwolone?
user202729,

@ user202729 To trochę poza tym, co sobie wyobrażałem, ale widzę, jak to jest zgodne z zasadami, które napisałem powyżej, więc pozwolę na to.
AdmBorkBork

1
Czy możemy użyć mniejszego rozmiaru płótna, jeśli nasz język nie obsługuje płótna 400 x 400?
Scott Milner,

Odpowiedzi:


8

LOGO ( FMSLogo ), 54 52 bajtów

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

Niestety nie mogę znaleźć żadnej obsługi myszy online obsługującej interpreter logo, takiej jak FMSLogo.

Jest to „szablon z jawnym gniazdem”, który jest podobny do lambda w innych językach programowania. Kliknij lewy przycisk myszy, aby uzyskać pierwszy punkt, i prawy przycisk myszy, aby uzyskać drugi punkt (odległość drukowania).

Objaśnienie: (Logo to język programowania grafiki żółwia)

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

To "puste słowo. Zwykle oczekuje się, że szablon będzie listą (gdzie []pusta lista nic nie robi), przekazanie słowa jest dopuszczalne (jest zawinięte w listę), w tym przypadku oszczędza 2 bajty.

Biegać:

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

Jest applyto jeden ze sposobów uruchamiania szablonu w Logo, []lista argumentów is, dla której szablon nie otrzymuje żadnego.


W jaki sposób gwarantuje to minimalne płótno 400 x 400?
David Mulder

1
@DavidMulder FMSLogo domyślnie (bez dodatkowego wiersza poleceń) rozpoczyna od płótna 1000 × 1000.
user202729,

7

Mathematica, 94 bajty

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

Kanwa jest losowym obrazem w skali szarości, pierwsze kliknięcie powinno być kliknięciem lewym przyciskiem myszy, a drugie kliknięciem prawym przyciskiem myszy. Dokładne zachowanie polega na tym, że kliknięcie prawym przyciskiem myszy drukuje odległość do ostatniego kliknięcia (lewy lub prawy), więc jeśli kilkakrotnie klikniesz prawym przyciskiem myszy, możesz także uzyskać kolejne odległości.

Wyniki są dokładne, więc mogą zawierać pierwiastek kwadratowy.

Jeśli rozdzielczość kamery internetowej wynosi co najmniej 400 x 400, możesz użyć CurrentImage[]zamiast 1~RandomImage~400płótna, oszczędzając 3 bajty.


@Jenny_mathy Mathematica wersja może? Testowałem to na 11.1.
Martin Ender,

6

Java 8, 469 389 388 385 380 357 348 325 bajtów

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

Byłoby krótsze z AWT, ale nigdy go nie użyłem.


Myślę, że truemoże być 0<1.
Jonathan Frech,

Ponadto main(String args[])nie może być main(String[]Z)?
Jonathan Frech,

Myślę, że {F f=new F();}może być {new F();}.
Jonathan Frech

setVisible(0<1);można usunąć i dodać .show()do ramki; printlnmoże być print.
Kevin Cruijssen

1
@KevinCruijssen Nie wiem, jak OP chce wyników dla wielu wyników
Roberto Graham

5

Java (OpenJDK 8) , 282 bajty

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

Nie mogę teraz tego przetestować; jeśli ktoś mógłby mi powiedzieć, czy są jakieś błędy kompilatora, które byłyby świetne.

AWT prawdopodobnie będzie krótszy, ale potrzebuję rzeczywistego IDE dla tego lol. Nigdy wcześniej nie korzystałem z AWT, ale mógłbym sprawić, żeby działał, gdybym miał IDE. Mógłbym użyć dokumentów, ale to naprawdę trudne lol

-10 bajtów za pomocą AWT dzięki Kevin Cruijssen
-44 bajtów za pomocą bloku inicjator; opracowane niezależnie od Roberta Grahama, chociaż teraz widzę, że zrobili to samo, myślę, że
-6 bajtów łączy kilka deklaracji dzięki Kevinowi
-11 bajtów, korzystając z interfacepodziękowań dla Kevina
-35 bajtów eliminując niektóre niepotrzebne zmienne dzięki
usunięciu mellamokb -9 bajtów niepotrzebny import i użycie kwalifikowanej nazwy dzięki mellamokb
-44 bajtów dzięki mellamokb i aditsu


4

TI-Basic (TI-84 Plus CE), 49 bajtów (45 tokenów) (możliwe, że nie konkuruje)

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

-7 bajtów z sugestiami od kamoroso94

Użytkownik nie „klika” per se, ale porusza się kursorem na ekranie wykresu za pomocą klawiszy strzałek i trafień, enteraby wybrać punkt, a najmniejszy ruch to ~ 1,5 dla xi ~ 2,4 dla y.

Wyjaśnienie:

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
Ponieważ rozmiar musi wynosić co najmniej 400, możesz grać w golfa tak, aby uzyskać coś takiego, co jest większe niż 400, ale jeden bajt mniej.
kamoroso94,

1
Możesz także zmniejszyć Displinię o dwa bajty za pomocą {X-A,Y-B:Disp √(sum(Ans²(oczywiście dwukropek lub znak nowej linii).
kamoroso94,

@ kamoroso94 Mój TI-BASIC jest zardzewiały, ale czy to nie byłaby 8^2taka sama liczba bajtów?
Todd Sewell,

@ToddSewell nie, 8^2(8 do kwadratu) ma 64 i mniej niż 400. Powiedziałem (8 kostek), który jest większy niż 400 i używa dwóch tokenów, po jednym bajcie: 8i ³.
kamoroso94,

1
@ToddSewell: Na pewno jest (MATH → 3).
Nick Matteo,

4

JavaScript (ES6) + HTML, 58 bajtów

Sama strona internetowa służy jako „płótno”; Myślę, że całkiem bezpiecznie jest założyć, że okno przeglądarki będzie mieć co najmniej 400 x 400 pikseli.

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


JavaScript (ES6) + HTML, 51 bajtów

Możemy zapisać 7 bajtów, jeśli zignorujemy dane NaNwyjściowe przy pierwszym kliknięciu. ( @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 bajtów

Edycja : Dzięki dodatkowym 13 bajtom CSS możemy zapewnić, że obszar przewijania będzie wystarczająco duży, aby pasował do wymagań 400 x 400.

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


2

Przetwarzanie / Java, 149 bajtów

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

Całkiem proste, używa 2 zmiennych globalnych i 3 wbudowanych funkcji, aby zrobić wszystko.

  • Konfiguracja: wystarczy zainicjować okno do 400 x 400
  • Rysuj: pusty, ale musi istnieć, aby przetwarzanie było interaktywne dla> 1 klatki
  • MousePressed: jeśli klikniesz lewym przyciskiem, zapisz współrzędne myszy w liczbach całkowitych a i b. Kliknij prawym przyciskiem myszy, zmierz odległość od punktu (a, b) do bieżącej pozycji i wydrukuj na konsoli.

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

Drukuje odległość między ostatnimi kliknięciami (pierwsza drukuje odległość od 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 bajtów

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

Można by pomyśleć, że język zbudowany specjalnie do przechwytywania i symulacji działań klawiatury i myszy byłby bardziej skuteczny w tym wyzwaniu ...

To tworzy okno z polem tekstowym 400 x 400 pikseli z ramką, aby było to oczywiste. Bez ramki wokół krawędzi znajduje się spacja, ale poza polem tekstowym i nie można tego stwierdzić. Dodanie granicy było najkrótszym sposobem ich rozróżnienia. gCOpcja, aby go uruchomić podprogram Cw dowolnym momencie kliknąć w polu tekstowym. Dlatego sekwencją poleceń jest lewy przycisk myszy, a następnie inny lewy przycisk myszy.

Znalazłem inne rozwiązanie, które ma 144 bajty, ale pozwala na kliknięcia na całym ekranie zamiast tylko w „oczywistym kanwie”. Zakończenie jest również denerwujące, ponieważ rejestrowane są zarówno lewe, jak i prawe kliknięcia i nie kończy się po zamknięciu 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 bajtów

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 ma domyślny rozmiar płótna (800x, 600y).

Spowoduje to utworzenie tymczasowego obrazu żółwia dla każdego klikniętego punktu „początek”, który znika po wybraniu następnego punktu „początek”. Takie zachowanie zostało zatwierdzone przez PO.


0

SmileBASIC, 86 bajtów

@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

Wykorzystuje ekran dotykowy do wprowadzania danych.


0

Java 8, 228 bajtów

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

Oto rozwiązanie Java, które używa przestarzałej metody AWT mouseDown, którą trzeba by głęboko zagłębić w API, aby znaleźć. Wiem o tym tylko dzięki kursowi programowania, który ukończyłem w szkole średniej, a jednym z projektów było stworzenie małego programu do malowania przy użyciu tej i podobnych metod. Do tej pory nie sądziłem, że będę miał dobry powód, aby go używać.


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}

wprowadź opis zdjęcia tutaj

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.