La distanza più breve tra due punti è una linea


27

Codifica un programma o una funzione per costruire una tela interattiva sullo schermo di almeno 400 pixel x 400 pixel. La tela può essere di qualsiasi colore desiderato, senza bordi o senza bordi, con o senza barra del titolo, ecc., Solo una forma di tela evidente.

L'utente farà clic su due aree distinte dell'area di disegno e il programma deve generare in qualche modo la distanza euclidea (in pixel) tra quei due clic (STDOUT, visualizzazione di un avviso, ecc.). I due clic possono essere solo clic sinistro, solo clic destro, un clic sinistro per il primo e un clic destro per il secondo, due clic doppio-sinistro, ecc., Qualsiasi combinazione è accettabile. Nota speciale: fare clic e trascinare (ad esempio, utilizzando MOUSEUP come secondo punto) non è specificamente consentito; devono essere due clic distinti.

L'utente deve poterlo fare più volte e deve ottenere un output ogni volta, fino a quando il programma non viene chiuso / forzatamente chiuso / ucciso / ecc. Puoi scegliere il metodo di chiusura (facendo clic su una X, ctrl-C, ecc.), Qualunque sia il golfista del tuo codice.

Regole

  • È accettabile un programma completo o una funzione. Se una funzione, tuttavia, è comunque necessario visualizzare in qualche modo l'output per l'utente (la restituzione del valore non è accettabile).
  • L'output può essere sulla console, visualizzato come avviso, popolato nell'area di disegno, ecc.
  • Sono vietate le scappatoie standard .
  • Si tratta di quindi si applicano tutte le normali regole del golf e vince il codice più breve (in byte).

Possiamo produrre risultati esatti (che possono contenere radici quadrate) o devono essere decimali?
Martin Ender,

@MartinEnder O / o. La formattazione dell'output non è la parte interessante di questa sfida.
AdmBorkBork,

1
La soluzione HTML / JS, dal secondo clic, genera la distanza da quel clic al clic precedente. (quindi se l'utente fa clic sui ntempi, n-1invece che sui floor(n/2)numeri vengono stampati) È consentito?
user202729

@ user202729 È un po 'al di fuori di quello che stavo immaginando, ma posso vedere come è conforme alle regole che ho scritto sopra, quindi lo permetterò.
AdmBorkBork,

1
Possiamo usare una dimensione di tela più piccola se la nostra lingua non supporta una tela di 400 x 400?
Scott Milner,

Risposte:


8

LOGO ( FMSLogo ), 54 52 byte

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

Sfortunatamente, non riesco a trovare nessun interprete di logo in linea che supporti il ​​mouse come FMSLogo.

Questo è un "modello di slot esplicito", che è simile a lambda in altri linguaggi di programmazione. Fare clic con il tasto sinistro del mouse per il primo punto e con il tasto destro del mouse per il secondo punto (distanza di stampa).

Spiegazione: (Il logo è un linguaggio di programmazione per la grafica delle tartarughe)

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

La "è una parola vuota. Normalmente il template dovrebbe essere un elenco (dove [], un elenco vuoto, non fa nulla), il passaggio di una parola è accettabile (è racchiuso in un elenco) e in questo caso salva 2 byte.

Correre:

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

Il applyè un modo per eseguire modello nel logo, il []è lista di argomenti, per i quali il modello riceve nessuno.


In che modo questo garantisce la tela minima 400x400?
David Mulder,

1
@DavidMulder FMSLogo per impostazione predefinita (senza riga di comando aggiuntiva) inizia con tela 1000 × 1000.
user202729

7

Mathematica, 94 byte

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

La tela è un'immagine casuale in scala di grigi, il primo clic dovrebbe essere un clic sinistro e il secondo un clic destro. Il comportamento esatto è in realtà che il clic con il tasto destro del mouse stampa la distanza dall'ultimo clic (sinistro o destro), quindi se si utilizza il tasto destro del mouse ripetutamente, è anche possibile ottenere distanze consecutive.

I risultati sono esatti, quindi potrebbero contenere una radice quadrata.

Se la risoluzione della tua webcam è di almeno 400x400, è possibile utilizzare CurrentImage[]invece che 1~RandomImage~400per la tela, risparmiando 3 byte.


@Jenny_mathy La versione di Mathematica forse? Ho provato questo su 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);}}

Sarebbe più breve con AWT, ma non l'ho mai usato.


Penso che truepotrebbe essere 0<1.
Jonathan Frech,

Inoltre, main(String args[])non può essere main(String[]Z)?
Jonathan Frech,

Penso che {F f=new F();}possa essere {new F();}.
Jonathan Frech,

setVisible(0<1);può essere rimosso e puoi aggiungere .show()al Frame; printlnpuò essere print.
Kevin Cruijssen,

1
@KevinCruijssen Non so come OP voglia l'output per più risultati
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();}};}}

Non posso provarlo adesso; se qualcuno potesse dirmi se ci sono errori del compilatore sarebbe fantastico.

AWT sarebbe probabilmente più breve, ma ho bisogno di un IDE effettivo per quel lol. Non avevo mai usato AWT prima, ma avrei potuto farlo funzionare se avessi un IDE. Potrei usare i documenti ma è davvero difficile lol

-10 byte usando AWT grazie a Kevin Cruijssen
-44 byte usando un blocco di inizializzazione; sviluppato indipendentemente da Roberto Graham anche se ora vedo che hanno fatto la stessa cosa, penso
-6 byte combinando alcune dichiarazioni grazie a Kevin
-11 byte usando un interfacegrazie a Kevin
-35 byte eliminando alcune variabili non necessarie grazie alla rimozione di mellamokb
-9 byte l'importazione non necessaria e l'utilizzo di un nome qualificato grazie a mellamokb
-44 byte grazie a mellamokb e aditsu


4

TI-Basic (TI-84 Plus CE), 49 byte (45 token) (possibilmente non competitivo)

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

-7 byte con suggerimenti da kamoroso94

L'utente non "fa clic" di per sé, ma si sposta attorno a un cursore sullo schermo del grafico con i tasti freccia e preme enterper selezionare un punto, e il movimento più piccolo è ~ 1,5 per x e ~ 2,4 per y.

Spiegazione:

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
Dal momento che la dimensione deve essere almeno di 400, puoi giocare quella costante a qualcosa di simile che è maggiore di 400 ma un byte in meno.
kamoroso94

1
Inoltre puoi ridurre la Displinea di due byte con {X-A,Y-B:Disp √(sum(Ans²(i due punti o la nuova riga funzionano ovviamente).
kamoroso94

@ kamoroso94 La mia TI-BASIC è arrugginita ma non sarebbe 8^2lo stesso numero di byte?
Todd Sewell,

@ToddSewell no, 8^2(8 quadrati) è 64 e meno di 400. Ho detto (8 cubi) che è maggiore di 400 e usa due token, un byte ciascuno: 8e ³.
kamoroso94

1
@ToddSewell: c'è sicuramente (MATH → 3).
Nick Matteo,

4

JavaScript (ES6) + HTML, 58 byte

La stessa pagina web funge da "tela" in questione; Penso che sia abbastanza sicuro supporre che la finestra del browser sarà almeno 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

Possiamo salvare 7 byte se ignoriamo l' NaNoutput al primo clic. ( @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

Modifica : con ulteriori 13 byte di CSS, possiamo garantire che l'area di scorrimento sia sufficientemente grande da soddisfare i requisiti di 400x400.

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


2

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

Abbastanza semplice, utilizza 2 variabili globali e 3 funzioni integrate per fare tutto.

  • Installazione: inizializza la finestra su 400x400
  • Disegna: vuoto, ma deve esistere affinché Elaborazione sia interattiva per> 1 fotogramma
  • Mouse premuto: se si fa clic con il tasto sinistro, salva le coordinate del mouse negli interi a e b. Se si fa clic con il tasto destro, misurare la distanza dal punto (a, b) alla posizione corrente e stampare sulla console.

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

Stampa la distanza tra gli ultimi clic (il primo stampa la distanza da 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

Tasto di scelta rapida, 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

Penseresti che un linguaggio creato appositamente per catturare e simulare le azioni di tastiera e mouse sarebbe più efficiente in questa sfida ...

Questo crea una finestra con una casella di testo di 400 x 400 pixel con un bordo per renderlo ovvio. Senza il bordo, c'è uno spazio attorno al bordo nella finestra ma fuori dalla casella di testo e non si può dire. L'aggiunta di un bordo era il modo più breve per differenziarli. L' gCopzione consente di eseguire la subroutine Cogni volta che si fa clic sulla casella di testo. La sequenza di comandi è, quindi, Clic sinistro seguito da un altro clic sinistro.

Ho trovato un'altra soluzione di 144 byte, ma consente clic su tutto lo schermo anziché solo nella "tela evidente". È anche fastidioso terminare perché vengono catturati sia i clic sinistro che destro e non si chiude quando si chiude la 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 viene fornito con una dimensione predefinita di tela di dimensioni (800x, 600y).

Ciò genera un'immagine di tartaruga temporanea per ogni punto 'inizio' cliccato, che scompare dopo aver selezionato il punto 'inizio' successivo. Questo comportamento è approvato dall'OP.


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

Utilizza il touchscreen per l'input.


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

Ecco una soluzione Java che utilizza un metodo AWT deprecato mouseDownche dovresti scavare in profondità nell'API per trovare. Lo so solo grazie al corso di programmazione che ho frequentato come studente del liceo e uno dei progetti era quello di realizzare un piccolo programma di pittura usando questo e metodi simili. Non avrei mai pensato di avere un buon motivo per usarlo fino ad ora.


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}

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.